【发布时间】:2016-03-31 21:21:38
【问题描述】:
我刚刚开始使用宏,感觉我错过了一些非常明显的东西......
我想检查 AST 是否有传递给我的宏的匿名 lambda 函数,最终我想对它做一些事情,但我遇到了第一个障碍。
我的代码是这样的;
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 宏食谱吗?
问候,
瑞恩。
【问题讨论】:
标签: scala abstract-syntax-tree anonymous-function scala-macros inspection