Я пытаюсь вручную сгенерировать AST, используя API отражения, используя 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, по-видимому, требует String в качестве аргумента. Если я передам строку "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>
[...]
Следовательно, фактический тип myfn в необработанных выходных данных AST предположительно отличается от String, но из документации API не видно, что это может быть.
Итак, кто-нибудь может сказать мне, как мне создать требуемый AST?
mirror.staticClass/staticModule
, чтобы добраться до него. - person Eugene Burmako   schedule 16.03.2013