Clojure - Другие полезные функции и макросы
Clojure

Другие полезные функции и макросы

Булевы функции и функции проверки: = == identical? not= not true? false? nil?
Разное: identity dotimes time assert with-open

Функции создания

Функция

Пример выражения

Возвращаемое значение

fn

(map (fn [x] (+ 2 x)) [1 2 3])

(3 4 5)

#() reader macro

(map #(+ 2 %) [1 2 3])

(3 4 5)

partial

(map (partial + 2) [1 2 3])

(3 4 5)

comp

(map (comp - *) [2 4 6] [1 2 3])

(-2 -8 -18)

complement

(map (complement zero?) [3 2 1 0])

(true true true false)

constantly

(map (constantly 9) [1 2 3])

(9 9 9)

Печать

Существуют несколько функций, чтобы печатать объекты в поток вывода - текущее значение out. Версии с суффиксом -str привязывают out к StringWriter, печатают в него и возвращают полученную строку. pr печатает объект(ы), разделенные пробелами, если их более одного. prn делает то же самое и в конце печатает символ новой строки newline. print и println вызывают pr и prn соответственно, c *print-readably* (которая по-умолчанию равен true) привязанной к nil, из-за чего строки печатаются без кавычек и без экранирования, а символы без начального '\' и также без экранирования. По-умолчанию, pr и prn печатают объекты так, чтобы они могли быть прочитаны считавателем, а print и println выводят объекты в удобном для чтения человеком виде. Когда *print-readably* не nil, вывод метаданных регулируется *print-meta*, который равен nil по-умолчанию.

Функции

Печать в *out*: pr prn print println newline
Печать в строку: pr-str prn-str print-str println-str with-out-str

Поддержка регулярных выражений

Регулярные выражения могут быть скомпилированы во время чтения с помощью макроса считывателя #"pattern" или во время исполнения с помощью re-pattern. Обе формы производят объекты класса java.util.regex.Pattern.

user=> (re-seq #"[0-9]+" "abs123def345ghi567")
("123" "345" "567")
user=> (re-find #"([-+]?[0-9]+)/([0-9]+)" "22/7")
["22/7" "22" "7"]
user=> (let [[a b c] (re-matches #"([-+]?[0-9]+)/([0-9]+)" "22/7")]
         [a b c])
["22/7" "22" "7"]
user=> (re-seq #"(?i)[fq].." "foo bar BAZ QUX quux")
("foo" "QUX" "quu")