从core.clj出发,定义了assoc (元数据修整等)。
(def assoc
(fn assoc
([map key val] (. clojure.lang.RT (assoc map key val)))
([map key val & kvs]
(let [ret (assoc map key val)]
(if kvs
(if (next kvs)
(recur ret (first kvs) (second kvs) (nnext kvs))
(throw (IllegalArgumentException. "assoc expects even no of args...")))
ret)))))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中)似乎表明后者工作正常,我找不到任何文档显示前者的使用情况。有什么线索吗?
谢谢,加里
发布于 2014-01-06 07:31:29
您的版本应该无法编译,因为没有足够的参数传递给recur (在本例中需要4个参数)。let的存在是为了将传递给第一个主体的第一对键/值的关联结果绑定为ret。如果第二个主体在前面使用recur和kvs = nil调用(作为第四个参数调用recur表单中的nnext的结果),(if kvs ..)将失败,ret可以简单地返回。如果有更多的kvs尾递归可能发生。
https://stackoverflow.com/questions/20944805
复制相似问题