2.10.3 の Scala API ドキュメントには、「refiy を使用して、特定の Scala 式を表す抽象構文ツリーを生成する」ことができると書かれています。したがって、私はできる:
scala> val uni = scala.reflect.runtime.universe
uni: scala.reflect.api.JavaUniverse = scala.reflect.runtime.JavaUniverse@4e42766
scala> uni reify { 1 to 3 }
res2: uni.Expr[scala.collection.immutable.Range.Inclusive] = Expr[scala.collection.immutable.Range.Inclusive](Predef.intWrapper(1).to(3))
上記の例では、探しているものが得られます: Predef.intWrapper(1).to(3))
(実行される操作の便利な拡張表現)。
1 + 3
しかし、私が具体化しようとすると、私が望む実行する操作を表現しません。
scala> uni reify { 1 + 3 }
res5: uni.Expr[Int(4)] = Expr[Int(4)](4)
これは予想される動作ですか?+
プリミティブな操作であり、具体化されていませんか?
Scala docs は、さらに便利な表現が利用可能であることを意味する具体化の例を示しています。
reify{ 2 + 4 } // Apply( Select( Literal(Constant(2)), newTermName("$plus")), List( Literal(Constant(4)) ) )
(存在する場合)の適切な拡張表現を調べるにはどう1 + 3
すればよいですか? また、式の詳細な表現 (すぐ上) を取得するにはどうすればよいですか?
編集: Scala docs の表現ショーが によって生成されていることがわかりましたshowRaw
。ただし、上記の例の生の表現ショーを再現することはまだできません2 + 4
。