Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure源代码中的Arity重载_Clojure - Fatal编程技术网

Clojure源代码中的Arity重载

Clojure源代码中的Arity重载,clojure,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

以下是中更新的源代码:

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

我的问题是:中的
更新(以及许多其他Clojure函数)为什么没有以这种方式实现?我想可能存在性能问题,即不使用
apply
更快。

是的,您猜对了:一些算术存在是因为
apply
的性能成本

在最常见的情况下(例如,
f
函数最多有3个参数)使用显式算术,可以在转换为直接函数调用时提高性能