以下是update-in
的源代码:
(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)))))
我的问题:为什么不是update-in
(以及许多其他Clojure函数)以这种方式实现?我猜有性能问题,即。不使用apply
会更快。
答案 0 :(得分:6)
是的,您已经猜对了:由于apply
的性能成本,存在一些问题。
对于最常见的情况(例如,f
函数最多3个参数)具有明确的arities可以提高性能,因为它转换为直接函数调用。