Почему такая реализация частичного в 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 склонны серьезно относиться к производительности, исходя из предположения, что базовые строительные блоки языка будут присутствовать в узких местах производительности каждого.