为什么Clojure核心库中实现的partial函数这样做?

7
我在浏览 clojure.core 时发现了 partial 函数的实现。它看起来像这样:
(defn partial
  "Takes a function f and fewer than the normal arguments to f, and
  returns a fn that takes a variable number of additional args. When
  called, the returned function calls f with args + additional args."
  {:added "1.0"
   :static true}
  ([f] f)
  ([f arg1]
   (fn [& args] (apply f arg1 args)))
  ([f arg1 arg2]
   (fn [& args] (apply f arg1 arg2 args)))
  ([f arg1 arg2 arg3]
   (fn [& args] (apply f arg1 arg2 arg3 args)))
  ([f arg1 arg2 arg3 & more]
   (fn [& args] (apply f arg1 arg2 arg3 (concat more args)))))

为什么有几个奇偶校验选项而不是一个呢?这只是为了性能优化,这样在大多数情况下就不会调用concat函数吗?
否则看起来应该像这样,对吗?
(defn partial
  ([f] f)
  ([f & more]
   (fn [& args] (apply f (concat more args))))
  )

我还注意到其他几个函数也遵循同样的模式。
1个回答

10

是的,这是一个性能优化。

这不仅仅是避免调用concat - 还因为在参数列表中使用&也需要创建一个集合。Clojure核心库通常认真对待性能,假设语言的基本构建块将存在于每个人的性能瓶颈中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接