I am writing a macro in Scala, but when I call it I get an error message saying "Double does not take parameters". Clearly there is something wrong with how the macro builds the AST. So how can I see the expanded macro? Is there a way to call the macro implementation at runtime?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Provide -Ymacro-debug-lite
or -Ymacro-debug-verbose
option to the compiler.
Off the top of my head, detalization of printed ASTs is governed by -Yshow-trees-compact
, -Yshow-trees-stringified
, -Xprint-types
, -uniqid
and -Yshow-symkinds
. You can find other gems by running scala -X
and scala -Y
(or inspecting the sources of scala settings at https://github.com/scala/scala/blob/2.10.x/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala).
Also, despite being essentially a macro, reification has its own tracing mechanism that can be configured by -Yreify-copypaste
and -Yreify-debug
.
回答2:
There is Macrocosm's desugar which can show how your source code, including, but no limited to macros, is transformed into.
println("TRANSFORMATION:\n"+ desugar{
println("a string")
MY_MACRO("something")
})