我正在研究一个宏,我想弄清楚如何避免扩展某些形式,以下面的宏为例,
(defmacro and
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))
When expanded,
(mexpand-all '(and 1 2 3))
成为,
(let* [and__973__auto__ 1]
(if and__973__auto__
(let* [and__973__auto__ 2]
(if and__973__auto__ 3 and__973__auto__))
and__973__auto__))
在这种情况下,我需要做的是阻止 let 扩展为 let*。
最佳答案
嗯?目前尚不清楚“停止”让
扩展的意思。 let
是 clojure.core 中定义的宏,编译器对此一无所知:它只理解 let*
。如果您的宏扩展为 let
(以某种方式)拒绝进一步扩展,它将无法编译。
如果你只想单独检查宏的输出,而不用担心递归扩展它,你应该使用 macroexpand
或 macroexpand-1
而不是这个 mexpand-all
东西。我不知道 mexpand-all
来自哪里,但是当我需要类似的东西时,我会使用 clojure.walk/macroexpand-all
。
关于macros - Clojure 宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5986383/