递归实现或在Clojure中

时间:2014-07-04 10:33:00

标签: recursion clojure

我试图实施自己的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库中,我知道一个有效的解决方案。

(也许尾递归与此相关?不确定。)

由于

丹尼尔

1 个答案:

答案 0 :(得分:3)

你没有递归的基本情况,即递归停止的情况:

(defmacro my-or
    [& args]
    (let [[x & xs] args]
      (if (nil? xs) `(if ~x ~x)
          `(if ~x ~x (my-or ~@xs)))))