Clojure:GitHub中两种不同的update-in定义

时间:2016-12-15 06:52:09

标签: git clojure

我一直在尝试重新实现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函数(即在以后的版本中没有引入)。

请某人:

  1. 澄清两个不同的版本是什么?
  2. 解释为什么当树更简洁的时候(虽然args略有不同),Master的更详细的定义是否存在?它是否经过重构才能更有效地工作?

1 个答案:

答案 0 :(得分:2)

主人实际上是最新的一个,可以通过查看两个树的 Blame 的结果来看到。对于Master分支,您可以看到引入更改的提交称为improve update-in perf。我没有在提交中看到任何更多信息,坦率地说这不是好事。

补丁引入了一个本地函数,它可以在存在非空ks参数时更改所执行的操作(一般情况下,当降序为键时)。 update-inapply的递归调用被up的直接调用所取代。