【问题标题】:Scala macro inspect tree for anonymous functionScala 宏检查树的匿名函数
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 嘿,doIt 必须是宏对你来说意味着什么?
    • @alifirat 应该定义为def doIt(f: () => String) = macro ...(注意问题是关于Scala 2的)。
    • 这个函数的目标是什么?返回 lambda 的 AST 吗?因为我有类似的问题,我很难解决它stackoverflow.com/questions/71444782/…
    • 您需要向问题的作者询问目标,而不是我 :) 它只是说“我想检查 AST 是否有传递给我的宏的匿名 lambda 函数,最终我想做一些事情到它”,但答案并不取决于它。
    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多