Recursion 通过let绑定的Clojure递归
从core.clj中,定义了assoc(修剪元数据等) ret的let绑定实现了什么?为什么不仅仅是: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
(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))))