飞镖:有效地重建树结构

时间:2018-08-14 13:26:30

标签: tree dart

我有体系结构问题。我正在Dart中建立一个计算机代数系统(尽管语言基本上无关紧要),并且想要不可变的表达式树。 BuiltValue似乎是一个完美的起点,但是我正在考虑构造构建器的最佳方法。

用例:给定一个表达式树和一些操作,可以有效地构造被操作的表达式树。例子:

// 2 + 3 -> 5
Sum([Int(2), Int(3)]).simplify() == Int(5)

// (x + y)^2 -> x^2 + 2*x*y + y^2
Power(Sum([Symbol('x'), Symbol('y')]), Int(2)).expand() == Sum(...)

大多数操作将是多次链接操作的结果,而我越能避免在每个步骤中重建表达式越好。有时这是不可能的-例如重复之后。

天真的我可以为每种表达式类型(IntBuilderSumBuilder等)创建一个单独的生成器。但是在这些操作过程中,根类型可能会改变。

我考虑过的事情:

    每个类的构建器-尽管我不确定如何更改根类型更改。像Sum([x]).simplify() == x这样的简化(或上面的第一个示例)在重建后并不太难处理,但是我不确定它们如何与上述第二个示例一起使用。
  • 一个单一的ExpressionBuilder,用于跟踪操作数和一些类似枚举的对象,用于标识结果子类。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

我给自己不必要的限制。

虽然我本来以为所有构建器操作都应使实例化构建器发生变化,但不返回任何内容,但是如果仅要求这些操作返回构建器,问题就变得更加简单。 unarySimplify(相当于Sum([x]) -> x的构建器)。

class SumBuilder implements ExpressionBuilder {
    ListBuilder<ExpressionBuilder> args;
    ExpressionBuilder unarySimplify() => args.length == 1? args[0]: this;
}