Для некоторых функций (особенно для функций, которые "seq in, seq out"), аргументы упорядочены так, что можно использовать partial
следующим образом:
(ns tst.demo.core
(:use tupelo.core tupelo.test))
(dotest
(let [dozen (range 12)
odds-1 (filterv odd? dozen)
filter-odd (partial filterv odd?)
odds-2 (filter-odd dozen) ]
(is= odds-1 odds-2
[1 3 5 7 9 11])))
Для других функций, Clojure часто следует за порядком «первым по важности» или «самым важным первым» (обычно они имеют одинаковый результат). Таким образом, мы видим примеры вроде:
(get <map> <key>)
(get <map> <key> <default-val>)
Это также показывает, что любые необязательные значения должны, по определению, быть последними (чтобы использовать аргументы rest). Это распространено в большинстве языков (например, Java).
Для записи я действительно не люблю использовать частичные функции, так как они имеют определяемые пользователем имена (в лучшем случае) или используются встроенными (больше общий). Рассмотрим этот код:
(let [dozen (range 12)
odds (filterv odd? dozen)
evens-1 (mapv (partial + 1) odds)
evens-2 (mapv #(+ 1 %) odds)
add-1 (fn [arg] (+ 1 arg))
evens-3 (mapv add-1 odds)]
(is= evens-1 evens-2 evens-3
[2 4 6 8 10 12]))
Также
Я лично нахожу это действительно раздражает , пытаясь разобрать код с помощью partial
как с evens-1
, особенно для случая пользовательских функций или даже стандартных функций, которые не так просты, как +
.
Это особенно верно, если partial
используется с 2 или больше аргументов
Для случая с 1 аргументом литерал функции, видимый для evens-2
, гораздо более читабелен для меня.
Если 2 или более Аргументы присутствуют, пожалуйста создайте именованную функцию (локальную, как показано для evens-3
) или обычную (defn some-fn ...)
глобальную функцию.