2014-07-04 108 views
0

我试图实现我自己的Clojure'或'宏(称为'我 - 或')。到目前为止,我已经有了:递归实现或在Clojure

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

然而,调用这个函数,例如当:

(my-or false 4 3) 

这导致的StackOverflowError。我很欣赏我所写的是递归的,但究竟是什么导致错误的函数呢?顺便提一下,我还看了一下clojure.core库中的'or'的官方实现,所以我意识到可以使用的解决方案。

(?也许尾递归是与此有关不确定)

感谢

丹尼尔

回答

3

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

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