2017-08-07 65 views
3

下面是update-in的源代码:元数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 [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更快。

回答

6

是的,您已经猜对了:由于apply的性能成本,存在一些实体。

对于最常见的情况(例如对于f函数,最多3个参数)具有显式的值会提高性能,因为它转换为直接函数调用。