以下是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更快。
发布于 2017-08-07 09:50:27
是的,您正确地猜到了这一点:由于apply的性能成本,存在一些特性。
对于最常见的情况(例如,f函数最多有3个参数)具有显式的特性可以提高性能,因为它可以转换为直接函数调用。
https://stackoverflow.com/questions/45543623
复制相似问题