2017-08-07 3 views
3

ここupdate-inのソースコードです:アリティが

(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))))) 
:私の知る限りでは

(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))))) 

(と私はあまり今ない)、これは常に同じ結果を与えます

私の質問:update-in(と他の多くのClojure関数)がこのように実装されていないのはなぜですか?私はパフォーマンスの問題があると推測します。 applyを使用しない方が高速です。

答えて

6

はい、あなたはそれを正しく推測しました。パフォーマンスコストがapplyであるため、いくつかのアライテンスが存在します。

最も一般的なケース(例えば、f関数の最大3つの引数)が明示的であると、直接関数呼び出しに変換されるため、パフォーマンスが向上します。

関連する問題