gpt4 book ai didi

clojure - Clojure 源代码中的 Arity 重载

转载 作者:行者123 更新时间:2023-12-02 10:34:31 24 4
gpt4 key购买 nike

这是 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更快。

最佳答案

是的,您猜对了:由于apply的性能成本而存在一些参数。

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

关于clojure - Clojure 源代码中的 Arity 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45543623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com