【问题标题】:Recursive implementation Or in Clojure递归实现或在 Clojure 中
【发布时间】:2014-07-04 10:33:00
【问题描述】:

我正在尝试实现我自己的 Clojure 'or' 宏(称为 '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 库中“或”的官方实现,所以我知道一个可行的解决方案。

(也许尾递归在这里是相关的?不确定。)

谢谢

丹尼尔

【问题讨论】:

    标签: recursion clojure


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多