这是源代码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)))))
Run Code Online (Sandbox Code Playgroud)
据我所知(我现在不多),这总是给出相同的结果:
(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)))))
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么不update-in(以及许多其他Clojure函数)以这种方式实现?我猜有性能问题,即.不使用apply更快.
是的,你已经猜对了:由于性能成本的原因,存在一些arities apply.
对于最常见的情况(例如,f函数最多3个参数)具有明确的arities 可以提高性能,因为它转换为直接函数调用.
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |