2017-08-07 64 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個參數)具有顯式的值會提高性能,因爲它轉換爲直接函數調用。