8

私は DSL に取り組んでいますが、メソッドをチェーン内の中置演算子として使用する際に問題が発生しました。いくつかのコードで説明しようと思います。私は特性Termとケースクラスを持っていて、それLiteralVariable拡張しています。いくつかの演算子を使用して用語インスタンスのリストを作成したいと考えています。

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))です。

4

1 に答える 1

16

演算子の優先順位は次の場所にあります。

Scala での演算子の優先順位

最初の回答による-と、手紙に比べて優先度が高いです。したがって、コンパイラは次のように式をグループ化します。

foo bar ("x" --> all)

優先度の低いもの (文字など) に置き換える場合は-->、コンパイルする必要があります。例えば:

foo bar "x" to all

の代わりにより優先度の高い演算子を選択することもできますbar。特殊文字であり、優先度が最も高い~~>ため、次のようなものが実行されます。~

foo ~~> "x" --> all
于 2011-05-05T21:21:14.103 に答える