私は DSL に取り組んでいますが、メソッドをチェーン内の中置演算子として使用する際に問題が発生しました。いくつかのコードで説明しようと思います。私は特性Term
とケースクラスを持っていて、それLiteral
をVariable
拡張しています。いくつかの演算子を使用して用語インスタンスのリストを作成したいと考えています。
case class Expr(val terms: List[Term]) {
def +(v: String) = Expr(Literal(v) :: terms)
def -->(func: List[String] => List[String]) = terms match {
case Literal(v) :: ts => Expr(Variable(v, func) :: ts)
case _ => throw new Exception("Can only apply function on literal")
}
}
object foo {
def bar(name: String) = Expr(Literal(name) :: Nil)
}
// some functions
val one = ...
val all = ...
// works
foo bar "x"
// res1: Expr = Expr(List(Literal(x)))
// works not
foo bar "x" --> all
// error: value --> is not a member of java.lang.String
// works
(foo bar "x") --> all
// res1: Expr = Expr(List(Variable(x,<function1>)))
これは と同等だと思いますfoo.bar("x").-->(all)
が、インタープリターはそれを と見なしているようfoo.bar("x".-->(all))
です。