我刚刚开始使用宏,感觉我错过了一些非常明显的痛苦......
我想检查 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 宏食谱值得我阅读吗?
Regards,
Ryan.
你只能得到传递给宏的 AST(在这种情况下,唯一涉及的宏是build
,然后你用参数来称呼它f
,这样你就得到了 ASTf
)。所以如果你想得到 AST() => "bar"
in doIt(() => "bar")
, doIt
本身必须是一个宏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)