Recursion 通过let绑定的Clojure递归

Recursion 通过let绑定的Clojure递归,recursion,clojure,let,Recursion,Clojure,Let,从core.clj中,定义了assoc(修剪元数据等) ret的let绑定实现了什么?为什么不仅仅是: (def assoc (fn assoc ([map key val] (. clojure.lang.RT (assoc map key val))) ([map key val & kvs] (if kvs (if (next kvs) (recur (first kvs) (second kvs) (nnext kvs

从core.clj中,定义了assoc(修剪元数据等)

ret的let绑定实现了什么?为什么不仅仅是:

(def assoc
 (fn assoc
   ([map key val] (. clojure.lang.RT (assoc map key val)))
   ([map key val & kvs]
      (if kvs
        (if (next kvs)
          (recur (first kvs) (second kvs) (nnext kvs))
          (throw (IllegalArgumentException. "assoc expects even no of args...")))
    ret))))
基本测试(在ClojureCLR中)似乎表明后者工作正常,我找不到任何说明使用前者的文档。有什么线索吗


谢谢,gary

您的版本应该无法编译,因为没有足够的参数传递给
recur
(这种情况下需要四个参数)。存在
let
以将传递到第一个主体(3-arity)的第一对键/值的关联结果绑定为
ret
。如果第二个主体在前面使用
recur
kvs
=
nil
(作为调用
recur
表单中的
nnext
作为第四个参数的结果),
(如果kvs..)
将失败,并且可以简单地返回
ret
。如果有更多的
kvs
tail,则可能发生递归。

您没有在递归中绑定正确的参数。您正在将
map
设置为
kvs
中的第一个键。谢谢。你当然是对的。我的“测试”并没有做我认为应该做的事情(或者其他任何事情!)
(def assoc
 (fn assoc
   ([map key val] (. clojure.lang.RT (assoc map key val)))
   ([map key val & kvs]
      (if kvs
        (if (next kvs)
          (recur (first kvs) (second kvs) (nnext kvs))
          (throw (IllegalArgumentException. "assoc expects even no of args...")))
    ret))))