【发布时间】:2017-02-16 13:22:13
【问题描述】:
我正在尝试一个coding challenge,它要求您创建可以无限编译的代码。
我的第一个想法是一个永远扩展为自身的宏。我写了:
(defmacro a []
(a))
(a)
这实际上并没有产生任何东西,但我希望它永远循环。然而,相反,我得到了一个荒谬的arity异常:
Wrong number of args (-2) passed to: infinite-compile/a, compiling:...
如果我尝试给它一个 kicks 参数,它现在会抱怨宏不期望任何参数。
如果我让它实际产生对自身的调用:
(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:
【问题讨论】: