Scala宏检查匿名函数

时间:2016-03-31 21:21:38

标签: scala abstract-syntax-tree anonymous-function scala-macros inspection

我刚刚开始使用宏,觉得我错过了一些非常痛苦明显的东西...

我想检查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宏食谱吗?

此致

瑞恩。

1 个答案:

答案 0 :(得分:3)

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