Скрытые функции Clojure

Какие менее известные но полезные функции Clojure Вы используете? Не стесняйтесь совместно использовать небольшие приемы и идиомы, но пытаться ограничить себя Core и Contrib.

Я нашел некоторую действительно интересную информацию в ответах на эти подобные вопросы:

Существует намного больше "Скрытой функции" вопросы для других языков, таким образом, я думал, что будет хорошо иметь один для Clojure, также.

27
задан 5 revs, 4 users 56% 23 May 2017 в 11:47
поделиться

4 ответа

(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"}] ...)

Если вам нужны значения по умолчанию для аргументов ключевого слова.

13
ответ дан 28 November 2019 в 04:46
поделиться

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]
23
ответ дан 28 November 2019 в 04:46
поделиться

Макрос чтения-оценки: # =

(read-string "#=(println \"hello\")")

Этот макрос может представлять угрозу безопасности, если чтение используется для ввода пользователем (что, возможно, само по себе является плохой идеей). Вы можете отключить этот макрос, установив для * read-eval * значение false .

11
ответ дан 28 November 2019 в 04:46
поделиться

Вы можете применить функции с бесконечными последовательностями аргументов. Например,

(apply concat (repeat '(1 2 3)))

производит ленивую последовательность 1,2,3,1,2,3 ... Конечно, чтобы это работало, функция также должна быть ленивой в отношении своего списка аргументов.

8
ответ дан 28 November 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: