我在Scala中编写一个宏,但是当我调用它时,我收到一条错误消息,说“Double不接受参数”。显然,宏构建AST的方式有问题。那我怎么能看到扩展的宏呢?有没有办法在运行时调用宏实现?
答案 0 :(得分:19)
为编译器提供-Ymacro-debug-lite
或-Ymacro-debug-verbose
选项。
脱离我的头脑,打印AST的分离由-Yshow-trees-compact
,-Yshow-trees-stringified
,-Xprint-types
,-uniqid
和-Yshow-symkinds
决定。您可以通过scala -X
和scala -Y
(或检查https://github.com/scala/scala/blob/2.10.x/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala处的scala设置来源)找到其他宝石。
此外,尽管本质上是一个宏,但是reification有自己的跟踪机制,可以由-Yreify-copypaste
和-Yreify-debug
进行配置。
答案 1 :(得分:2)
有Macrocosm's desugar可以显示您的源代码(包括但不限于宏)的转换方式。
println("TRANSFORMATION:\n"+ desugar{
println("a string")
MY_MACRO("something")
})