Clojure源代码中的Arity重载

时间:2017-08-07 09:30:05

标签: clojure

以下是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会更快。

1 个答案:

答案 0 :(得分:6)

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

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