我一直在尝试重新实现update-in作为学习练习,并且一直在使用Clojure的core.clj GitHub来找到明确的答案。我找到了两个单独的函数定义,一个在Master分支中:
(defn update-in
;; metadata removed
{:added "1.0"
:static true}
([m ks f & args]
(let [up (fn up [m ks f args]
(let [[k & ks] ks]
(if ks
(assoc m k (up (get m k) ks f args))
(assoc m k (apply f (get m k) args)))))]
(up m ks f args))))
010864f8ed...树中的一个:
(defn update-in
;; metadata removed
{:added "1.0"
:static true}
([m [k & ks] f & args]
(if ks
(assoc m k (apply update-in (get m k) ks f args))
(assoc m k (apply f (get m k) args)))))
据推测(虽然我不知道如何找出),非主树中的版本是较新的,并没有被带入主人。我已经尝试在REPL中实现非Master版本,它似乎工作正常。我可以看到参数略有不同,在REPL中调用(doc update-in)
会返回与树定义相同的参数。
我也有点混淆为什么Master中的定义比非Master版本更冗长,后者似乎使用已建立的Clojure函数(即在以后的版本中没有引入)。
请某人:
答案 0 :(得分:2)
主人实际上是最新的一个,可以通过查看两个树的 Blame 的结果来看到。对于Master分支,您可以看到引入更改的提交称为improve update-in perf。我没有在提交中看到任何更多信息,坦率地说这不是好事。
补丁引入了一个本地函数,它可以在存在非空ks
参数时更改所执行的操作(一般情况下,当降序为键时)。 update-in
到apply
的递归调用被up
的直接调用所取代。