Какие менее известные но полезные функции Clojure Вы используете? Не стесняйтесь совместно использовать небольшие приемы и идиомы, но пытаться ограничить себя Core и Contrib.
Я нашел некоторую действительно интересную информацию в ответах на эти подобные вопросы:
Существует намного больше "Скрытой функции" вопросы для других языков, таким образом, я думал, что будет хорошо иметь один для Clojure, также.
(defn foo [a & [b c]] ...)
Вы можете разрушить остальной аргумент.
Обновление:
Последняя фиксация репозитория git (29389970bcd41998359681d9a4a20ee391a1e07c) сделала возможным выполнение ассоциативной деструктуризации следующим образом:
(defn foo [a & {b :b c :c}] ...)
Очевидное использование этого - для аргументов ключевого слова. Обратите внимание, что этот подход предотвращает смешивание аргументов ключевого слова с аргументами отдыха (не то, чтобы это могло понадобиться очень часто).
(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)
Если вам нужны значения по умолчанию для аргументов ключевого слова.
Clojure имеет неизменяемый, постоянный тип данных очереди, PersistentQueue, но у него (пока?) Нет синтаксиса буквального считывателя или функций оболочки Clojure, поэтому вы должны создать их с помощью вызова Java. Очереди соединяются (толкаются) сзади и выталкиваются спереди с хорошей производительностью.
user> (-> (clojure.lang.PersistentQueue/EMPTY)
(conj 1 2 3)
pop)
(2 3)
Списки соединяются спереди и появляются спереди. Векторы соединяются сзади и появляются сзади. Иногда очереди - это именно то, что вам нужно.
user> (-> ()
(conj 1 2 3)
pop)
(2 1)
user> (-> []
(conj 1 2 3)
pop)
[1 2]
Макрос чтения-оценки: # =
(read-string "#=(println \"hello\")")
Этот макрос может представлять угрозу безопасности, если чтение
используется для ввода пользователем (что, возможно, само по себе является плохой идеей). Вы можете отключить этот макрос, установив для * read-eval *
значение false
.
Вы можете применить
функции с бесконечными последовательностями аргументов. Например,
(apply concat (repeat '(1 2 3)))
производит ленивую последовательность 1,2,3,1,2,3 ... Конечно, чтобы это работало, функция также должна быть ленивой в отношении своего списка аргументов.