Вы можете использовать привязку хэш-карты для деструктурирования дополнительных параметров, таких как:
(defn myfunction
[value & {:keys [go-there do-this do-that times] :or {times 1}}]
{:pre [(integer? times) (< 0 times)]}
(println "Saw a" value)
(when go-there
(dotimes [n times]
(when do-this (println "Did THIS with" value))
(when do-that (println "Did THAT with" value)))))
Вышеуказанную функцию можно вызвать следующим образом:
(myfunction "foo" :go-there true :do-this true :do-that false :times 5)
Обратите внимание, что вы можете определить значения по умолчанию для ключей с предложением :or {times 1}
. Следующий вызов функции будет повторяться только один раз из-за этого значения по умолчанию:
(myfunction "foo" :go-there true :do-this true :do-that false)
Кроме того, предусловия Clojure обеспечивают удобное тестирование параметров, что также применимо к значениям деструктурированных ключей, как это видно в выражении {:pre [...]}
сразу после привязки параметров. Следующий вызов не будет выполнен из-за этой проверки предварительного условия:
(myfunction "foo" :go-there true :do-this true :do-that false :times -1)