我正在为 scala 寻找一个简单的 CAS 系统。
它应具有以下特点:
- 提供对抽象语法树的访问权限(最好通过案例类以便于匹配)
- 解析
String
为 AST - 简化表达式
如果不存在并且我必须自己写一些基本的东西,那么最好的表示是什么?
我在想这样的事情:
abstract trait Term
{
def simplify:Term
def evaluate(assignment:Var => Double):Double
def derivative:Term
}
case class Const(c:Int) extends Term
case class Var(x:String) extends Term
case class Negate(x:Term) extends Term
case class Subtract(x:Term, y:Term) extends Term
case class Divide(x:Term, y:Term) extends Term
object Add { def apply(x:Term*):Add = Add(x.toList) }
case class Add(xs : List[Term]) extends Term
object Multiply { def apply(x:Term*):Multiply = Multiply(x.toList) }
case class Multiply(xs:List[Term]) extends Term
case class Power(x:Term, y:Term) extends Term
case class Exp(x:Term) extends Term
我会实现这里描述的简化算法,这看起来很乏味。(但在简化代数表达式时,也许乏味是不可避免的?)
对这个特定实现的一些批评是:
- 我将在
simplify
所有地方递归调用案例类的参数(似乎它可以以某种方式集中) - 处理 varargs /
List
参数似乎会变得Add
混乱Mutliply