Я не думаю, что какое-либо из этих решений является самым простым. Я бы предложил выбрать один из следующих вариантов:
A. Используйте обычную форму потоков:
(-> {:a 1, :b 2}
(update :a inc)) => {:a 2, :b 2}
Все привыкли видеть это и могут легко это понять. Поскольку вы уже отказались от этого подхода, я полагаю, что вы думаете, что код понятнее с использованием именованного параметра.
B. Используйте именованную функцию
(defn updater [x] (update x :a inc))
(-> {:a 1, :b 2}
updater) => {:a 2, :b 2}
(-> {:a 1, :b 2}
(updater)) => {:a 2, :b 2}
Это больше, чем предполагалось работать с формой ->
. Я думаю, что 2-я версия является самой ясной, поскольку она наиболее последовательна, когда все выражения функций имеют круглые скобки (один аргумент или несколько аргументов).
C. Подумайте об использовании макроса it->
из библиотеки Tupelo :
(it-> {:a 1, :b 2}
(update it :a inc)) => {:a 2, :b 2}
Как и в случае с именованной функцией, выражение представляет собой обычную форму Clojure без параметра «невидимый», который вставляется в * без вывода сообщений. 1023 * выражение. Местоимение it
служит временным заполнителем для значения с резьбой (идея скопирована с Groovy). Простой, явный и гибкий, поскольку it
может находиться в первом, последнем или любом другом расположении параметра:
(it-> 1
(inc it) ; thread-first or thread-last
(+ it 3) ; thread-first
(/ 10 it) ; thread-last
(str "We need to order " it " items." ) ; middle of 3 arguments
;=> "We need to order 2 items." )