2014-03-05 3 views
5

Мне нужно получить AST для реализации лямбда-функции. И я застреваю, потому что reify работает над аргументом, а не по его значению.Обоснование реализации функции вместо ссылки

val x = (a: Int) => println("a") 
val t = showRaw(reify(thevalueof x)) //something here should change 
println(t) 

должен напечатать:

Expr(Function(List(ValDef(Modifiers(PARAM), newTermName("a"), Ident(scala.Int), EmptyTree)), Apply(Select(Select(This(newTypeName("scala")), newTermName("Predef")), newTermName("println")), List(Literal(Constant("a")))))) 

я должен там должен быть трюк с сращивания или около того, но я просто не могу управлять, чтобы сделать это.

ответ

5

В настоящее время нет надежного способа получить АСТ программы вне приложения макроса (а reify - макрос, поэтому он соблюдает те же правила). Однако мы экспериментируем с движком макросов следующего поколения, который может решить эту проблему: http://scalamacros.org/news/2014/03/02/project-palladium.html.