如何在其他宏的范围内扩展宏(尝试调试宏)

mas*_*cip 2 macros clojure

这是我可以做的最简单的例子:

(defmacro printer [& forms]
  `(println ~@forms))

(defmacro adder [s]
  `(inc ~s))
Run Code Online (Sandbox Code Playgroud)

它们可以按预期使用:

(printer "haha")
=> "haha"

(adder 1)
=> 2
Run Code Online (Sandbox Code Playgroud)

我可以macroexpand让他们看看宏做了什么:

(macroexpand '(printer 1))
=> (clojure.core/println 1)

(macroexpand '(adder 1))
=> (clojure.core/inc 1)
Run Code Online (Sandbox Code Playgroud)

但是当它们嵌套时我得不到我想要的东西:

(macroexpand '(printer (adder 1)))
=> (clojure.core.println (adder 1))
Run Code Online (Sandbox Code Playgroud)

我希望得到

=> (clojure.core.println (clojure.core/inc 1))
Run Code Online (Sandbox Code Playgroud)

有没有办法扩展嵌套宏?这对于调试特定的bug有很大帮助.

opt*_*evo 5

你是在追求 macroexpand-all

(use 'clojure.walk)
(macroexpand-all '(printer (adder 1)))
;(clojure.core/println (clojure.core/inc 1))
Run Code Online (Sandbox Code Playgroud)