3

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

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

问候,

瑞安。

4

1 回答 1

4

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

于 2016-04-01T07:41:09.090 回答