Clojure源代码中的Arity重载
以下是中更新的源代码:Clojure源代码中的Arity重载,clojure,Clojure,以下是中更新的源代码: (defn update-in ([m [k & ks] f] (if ks (assoc m k (update-in (get m k) ks f)) (assoc m k (f (get m k))))) ([m [k & ks] f a] (if ks (assoc m k (update-in (get m k) ks f a)) (assoc m k (f (get m k) a)))) ([m
(defn update-in
([m [k & ks] f]
(if ks
(assoc m k (update-in (get m k) ks f))
(assoc m k (f (get m k)))))
([m [k & ks] f a]
(if ks
(assoc m k (update-in (get m k) ks f a))
(assoc m k (f (get m k) a))))
([m [k & ks] f a b]
(if ks
(assoc m k (update-in (get m k) ks f a b))
(assoc m k (f (get m k) a b))))
([m [k & ks] f a b c]
(if ks
(assoc m k (update-in (get m k) ks f a b c))
(assoc m k (f (get m k) a b c))))
([m [k & ks] f a b c & args]
(if ks
(assoc m k (apply update-in (get m k) ks f a b c args))
(assoc m k (apply f (get m k) a b c args)))))
据我所知(我现在不太清楚),这总是会产生相同的结果:
(defn my-update-in2
([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)))))
我的问题是:中的
更新(以及许多其他Clojure函数)为什么没有以这种方式实现?我想可能存在性能问题,即不使用apply
更快。是的,您猜对了:一些算术存在是因为apply
的性能成本
在最常见的情况下(例如,f
函数最多有3个参数)使用显式算术,可以在转换为直接函数调用时提高性能