我试图实施自己的Clojure'或者#39;宏(称为' my-or')。到目前为止,我已经:
(defmacro my-or
[& args]
(let [[x xs] (seq args)]
`(if ~x ~x (my-or ~xs))))
但是,在调用此函数时,例如:
(my-or false 4 3)
这会导致StackOverflowError。我很欣赏我所写的是递归的,但究竟是什么导致错误呢?顺便说一下,我还看了一下'或''的正式实施情况。在clojure.core库中,我知道一个有效的解决方案。
(也许尾递归与此相关?不确定。)
由于
丹尼尔
答案 0 :(得分:3)
你没有递归的基本情况,即递归停止的情况:
(defmacro my-or
[& args]
(let [[x & xs] args]
(if (nil? xs) `(if ~x ~x)
`(if ~x ~x (my-or ~@xs)))))