私は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
厄介になる可能性があるようです