Scala宏检查树中的匿名函数



我刚开始使用宏,感觉我错过了一些非常明显的东西。。。

我想检查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宏食谱值得我阅读?

问候,

Ryan。

您只得到传递给宏的AST(在这种情况下,唯一涉及的宏是build,您用参数f调用它,因此您得到f的AST)。因此,如果要在doIt(() => "bar")中获得() => "bar"的AST,则doIt本身必须是一个宏。

相关内容

  • 没有找到相关文章

最新更新