【问题标题】:How do I print an expanded macro in Scala?如何在 Scala 中打印扩展宏?
【发布时间】:2012-07-26 20:35:01
【问题描述】:

我正在 Scala 中编写一个宏,但是当我调用它时,我收到一条错误消息,提示“Double 不接受参数”。很明显,宏构建 AST 的方式有问题。那么我怎样才能看到扩展的宏呢?有没有办法在运行时调用宏实现?

【问题讨论】:

    标签: scala macros scala-2.10


    【解决方案1】:

    为编译器提供-Ymacro-debug-lite-Ymacro-debug-verbose 选项。

    在我的脑海中,打印的 AST 的细化由 -Yshow-trees-compact-Yshow-trees-stringified-Xprint-types-uniqid-Yshow-symkinds 管理。您可以通过运行 scala -Xscala -Y 找到其他 gem(或在 https://github.com/scala/scala/blob/2.10.x/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala 检查 scala 设置的来源)。

    此外,尽管实质上是一个宏,但具体化有其自己的跟踪机制,可以由-Yreify-copypaste-Yreify-debug 配置。

    【讨论】:

      【解决方案2】:

      Macrocosm's desugar 可以显示您的源代码(包括但不限于宏)是如何转换成的。

          println("TRANSFORMATION:\n"+ desugar{
              println("a string") 
              MY_MACRO("something")
          })
      

      【讨论】:

      • 我刚试过,但由于扩展宏不进行类型检查,所以当我将它包装在对 desugar 的调用中时,它也不会进行类型检查。
      • 对不起,我刚刚注意到我确实误解了你的问题。如果 MY_MACRO 失败,我的示例无法编译!
      • 在这种情况下,到目前为止,我已经在 Eclipse 中使用了 scala.reflect.makro.FrontEnds#echo(),这相当于使用 println() 调试运行时......总比没有好虽然:)
      • 这有点帮助,但必须有一种方法可以查看整个生成的树。
      • 回到错误,难道不能是 Apply(Double,...) 而不是 Apply(Double.apply,...)?
      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多