我有体系结构问题。我正在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(...)
大多数操作将是多次链接操作的结果,而我越能避免在每个步骤中重建表达式越好。有时这是不可能的-例如重复之后。
天真的我可以为每种表达式类型(IntBuilder
,SumBuilder
等)创建一个单独的生成器。但是在这些操作过程中,根类型可能会改变。
我考虑过的事情:
Sum([x]).simplify() == x
这样的简化(或上面的第一个示例)在重建后并不太难处理,但是我不确定它们如何与上述第二个示例一起使用。
我错过了一些明显的东西吗?
答案 0 :(得分:2)
我给自己不必要的限制。
虽然我本来以为所有构建器操作都应使实例化构建器发生变化,但不返回任何内容,但是如果仅要求这些操作返回构建器,问题就变得更加简单。 unarySimplify
(相当于Sum([x]) -> x
的构建器)。
class SumBuilder implements ExpressionBuilder {
ListBuilder<ExpressionBuilder> args;
ExpressionBuilder unarySimplify() => args.length == 1? args[0]: this;
}