Одна из особенностей, которая делает Clojure шуткой (и функциональным языком в целом), заключается в том, что функции - это вещи первого класса в Clojure, в частности, они являются объектами.Когда вы создаете функцию с помощью (defn name [arg] ...)
if, создаете функцию и затем сохраняете ее в var, чтобы вы могли найти ее позже в любом месте вашей программы.это примерно так:
(def name (fn [arg] ...))
теперь имя содержит функцию, которая широко доступна.Функции не должны храниться в VARS, особенно если они нужны только внутри вашей функции.В этом случае имеет смысл связать функцию с локальным именем, как в ответе Мэтта Фенвика.
(let [name (fn [agr] ...)] ...)
макрос letfn
делает это более элегантным.Важно понимать, что функции - это объекты, которые хранятся в вещах, и вы можете выбрать контейнер, который соответствует вашим потребностям.