Scala 宏检查匿名函数的树

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

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

我想检查传递给我的宏的匿名 lambda 函数的 AST,最终我想对它做一些事情,但我遇到了第一个障碍。

我的代码是这样的;

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 宏指南?

问候,

瑞安。

最佳答案

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

关于Scala 宏检查匿名函数的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36344046/

相关文章:

c++ - 解析 AST 时 clang 未识别 'ptrdiff_t' 、 'size_t' 、 'wchar_t'

c# - 开发抽象语法树

javascript - 不带参数的匿名函数返回带参数的自身

c# - 没有输入参数的匿名函数

scala - 无法过滤 Spark 2.2.0 中数据框中存储的 CSV 列

powershell - 从 Powershell 脚本中提取 AST

scala - 可空列在尝试写入空值时导致 SlickException

python - 如何在Dart中创建某些类类型的对象的列表?

scala - 如何将加密密码设置为凭据以使用 sbt 发布 Nexus OSS?

sql-server - 当 set_identity 关闭时,如何将 Spark 数据帧推送到 Sql Server 表?