我正在尝试一个编码挑战,要求您创建无限编译的代码。
我的第一个想法是一个永远扩展到自身的宏。我写了:
(defmacro a []
(a))
(a)
这实际上并没有产生任何东西,但我希望它永远循环。然而,相反,我得到了一个荒谬的arity异常:
Wrong number of args (-2) passed to: infinite-compile/a, compiling:...
如果我尝试给它一个踢的参数,它现在会抱怨宏不期望任何参数。
如果我让它实际上产生对自身的调用:
(defmacro a []
`(a))
(a)
它因 StackOverflow 而失败,这是我预期的。
这里发生了什么?为什么它认为我正在传递宏“-2”参数?我能想到的唯一可能的事情是它与&
传递给宏的 2 个隐式参数有关,但这只是在黑暗中的一个镜头,并没有真正解释发生了什么。
为了解决这个问题,这似乎不是多元宏的问题,因为它只有一个 0 元版本。此外,显式传递隐式参数不会做任何事情:
(defmacro a []
(a &form &env))
这产生:
Compiler Exception clojure.lang.ArityException: Wrong number of args (2) passed to: infinite-compile/a, compiling: