我正在尝试使用反射 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 的实际类型可能不是字符串,但从 API 文档中看不出它可能是什么。
那么,谁能告诉我如何构建所需的 AST?