0

Я просто начать работу с макросами и чувствую, что я что-то действительно болезненно очевидное не хватает ...Scala макрос инспектировать дерево для анонимной функции

Я хочу, чтобы проверить AST для анонимного лямбда-функции передается мой макро, в конечном итоге я хочу что-то сделать, но я упал на первое препятствие.

Мой код выглядит следующим образом;

object Test extends App { 
    doIt(() => "bar") 

    def doIt(f:() => String) = { 
    Builder.build(f) 
    } 
} 

object Builder { 
    def build[R](func:() => R): String = macro builder_impl[R] 

    def builder_impl[R](c: blackbox.Context)(func: c.Expr[() => R]): c.Expr[String] = { 
    import c.universe._ 

    println(showRaw(func)) 

    reify { 
     println("hello yeah") 
     "foo" 
    } 
    } 
} 

Я ожидаю showRaw, чтобы напечатать что-то вроде;

Expr(Function(List(), Literal(Constant("bar")))) 

Однако вместо этого я получаю;

Expr(Ident(TermName("f"))) 

я могу получить то, что я хочу, определив свою анонимную функцию на месте вызова, чтобы Builder.build как это;

Builder.build(() => "bar") 

Однако это не помогает мне делать то, что мне нужно.

Может кто-нибудь объяснить, что я не понимаю, как я могу достичь своей цели?

Кроме того, есть ли какая-нибудь удивительная кулинарная книга Scala, которую я должен прочитать?

С уважением,

Ryan.

ответ

1

Вы можете получить только AST, что вы прошли в макрос (в данном случае единственный макрос задействованного build, и вы называете это с аргументом f, так что вы получите AST из f). Поэтому, если вы хотите получить АСТ () => "bar" в doIt(() => "bar"), doIt сам должен быть макросом.