Scala 宏检查匿名函数的树
Scala macro inspect tree for anonymous function
我刚刚开始使用宏,感觉我遗漏了一些非常明显的东西...
我想检查传递给我的宏的匿名 lambda 函数的 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 宏指南?
此致,
瑞安
你只得到你传递给宏的 AST(在这种情况下,唯一涉及的宏是 build
,你用参数 f
调用它,所以你得到 f
).所以如果要得到doIt(() => "bar")
中() => "bar"
的AST,doIt
本身必须是一个宏
我刚刚开始使用宏,感觉我遗漏了一些非常明显的东西...
我想检查传递给我的宏的匿名 lambda 函数的 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 宏指南?
此致,
瑞安
你只得到你传递给宏的 AST(在这种情况下,唯一涉及的宏是 build
,你用参数 f
调用它,所以你得到 f
).所以如果要得到doIt(() => "bar")
中() => "bar"
的AST,doIt
本身必须是一个宏