这是我可以做的最简单的例子:
(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有很大帮助.
你是在追求 macroexpand-all
(use 'clojure.walk)
(macroexpand-all '(printer (adder 1)))
;(clojure.core/println (clojure.core/inc 1))
Run Code Online (Sandbox Code Playgroud)