C ++像电子表格一样动态计算值?

时间:2017-11-04 05:48:16

标签: c++ dynamic

是否可以像在电子表格中那样动态地在C ++中计算值(对另一个变量的反应已被更改)?

例如:

int x;
y = 2 * x;
cin >> x;
cout << y;

我想这样做,以便我可以重复修改xcout << y将显示重新计算的值,而不必关闭程序或endl并再次输入以输入不同的x值。 (见图)

spreadsheet example

3 个答案:

答案 0 :(得分:1)

不能以这种方式进行编码。定义变量时,会从内存中提供空闲空间,但不能进行算术处理,因为没有进行值赋值。

答案 1 :(得分:-1)

您真的想在程序中嵌入interpreter。您可以嵌入LuaGuile等等......

像Excel这样的spreadsheet是一种特殊的lazy事件驱动的函数式编程语言的解释器,具有很好的表驱动GUI。某些电子表格(例如LibreofficeGnumeric)为free software,因此您可以研究其源代码(并可能根据您的需要调整或扩展它)。通过一些努力(可能需要几个月),您可以编写一个简单的电子表格程序(Qt部分使用GUI)。 github上有许多免费软件电子表格程序。

否则,请自己编写口译员或评估员。定义您的语言及其语法(使用EBNF表示法)和semanticsParse将一些语法AST添加到JIT compilation中,将 environment 的一些概念映射到值,并对您的求值程序进行编码。给定环境和某个表达式的AST,您的求值程序将(递归地)计算给定环境中给定表达式的值。您甚至可以考虑使用一些GCCJIT库(如Dragon Book)来生成与每个表达式相关的机器代码。

阅读Programming Language PragmaticsLisp In Small Piecesplugins将有助于设计然后实现这样的解释器(或简单的电子表格)。

也许您只需要接受this answer到您的软件。

另请参阅{{3}}相关问题。

不要忘记C ++变量只有编译器知道。在执行期间,它们只是内存位置。

答案 2 :(得分:-1)

是的,你可以。但你必须编程。 最简单的版本是使用lambda:

int main()
{
    int y;
    int x;
    auto updateYfromX = [ & ]()
    {
        y = x * 2;
    };

    std::cin >> x;
    updateYfromX();

    std::cout << '\n' << x << ':' << y << '\n';
}

但问题是你必须记住每次x改变时调用更新函数;

那么现在呢? 现在你需要利用C ++的强大功能,创建一个自动对其值的变化作出反应的类。

这是一个类ReactOnChangeInt。 它需要一个附加参数,一个函数,每次为其赋值时都会调用它。

#include <iostream>
#include <functional>

class ReactOnChangeInt
{
    int value;
    const std::function<void(const int)> onChangeAction;
public:
    ReactOnChangeInt( const std::function<void(const int)> action )
        : value{}
        , onChangeAction( action )
    { }
    ReactOnChangeInt(const int i, const std::function<void (const int)> action)
        : value(i)
        , onChangeAction( action )
    {}

    int operator= (const int i)
    {
        value = i;
        onChangeAction(value);
        return value;
    }

    operator int() const
    {
        return value;
    }

    friend std::ostream& operator << (std::ostream& out, ReactOnChangeInt m)
    {
        out << m.value;
        return out;
    }
    friend std::istream& operator >> ( std::istream& in, ReactOnChangeInt& m )
    {
        int i;
        in >> i;
        m = i;
        return in;
    }
};

您可以这样使用:

int main()
{
    int y;
    ReactOnChangeInt x ( [ & ]( const int val )
    {
        y = val * 2;
    } );

    std::cin >> x;

    std::cout << '\n' << x << ':' << y << '\n';
}

下一步是创建类的通用版本(使用模板),这样您就可以使用任何类型(不只是int)。