リフレクションAPIを使用してASTを手動で生成しようとしています。また、showRawを使用して、必要な構文に関するヒントを提供しています。このコード:
object myfn extends Function2[ Double, Double, Double ] {
def apply( x : Double, y : Double ) = x + y
}
val x = 0.0
println( showRaw( reify( myfn( x, x ) ).tree ) )
生のAST出力を提供します。
Apply(Select(Ident(myfn), newTermName("apply")),
List(Ident(newTermName("x")), Ident(newTermName("x"))))
生の出力のリテラルテキストをプログラムに戻すと、コンパイルされません。
val v = Apply(Select(Ident(myfn), newTermName("apply")),
List(Ident(newTermName("x")), Ident(newTermName("x"))))
// ^ doesn't compile
Identは明らかに引数として文字列を必要とするためです。文字列「myfn」を渡すと、
val v = Apply(Select(Ident("myfn"), newTermName("apply")),
List(Ident(newTermName("x")), Ident(newTermName("x"))))
runtimeMirror( getClass.getClassLoader ).mkToolBox().eval( v )
コンパイルされますが、実行時に評価が失敗します。
"scala.tools.reflect.ToolBoxError: reflective compilation has failed:
value apply is not a member of <notype>
[...]
したがって、生のAST出力のmyfnの実際のタイプは、おそらくString以外のものですが、APIドキュメントからはそれが何であるかは明らかではありません。
だから、誰かが私が必要なASTを構築する方法を教えてもらえますか?