Почему такая реализация частичного в clojure.core

Я наткнулся на реализацию partial функция в cojure.core, Это выглядит так:

(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 ответ

Решение

Да, это оптимизация производительности.

Я не просто не звоню concat - это о том, что & в списке аргументов требуется также создание коллекции. Основные библиотеки clojure склонны серьезно относиться к производительности, исходя из предположения, что базовые строительные блоки языка будут присутствовать в узких местах производительности каждого.

Другие вопросы по тегам