Одна хитрость, которая иногда удобна, когда требуется более одного аргумента, который нужно заключить в кавычки, - это обернуть все в вектор, чтобы избежать цитирования каждого аргумента в отдельности. Рассмотрим:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test) )
(defn foo
[args] ; not rest args. no `&` present!
(spyx args))
(dotest
(foo (quote [(+ 1 2) (+ 3 4)])) ; sometimes this is easier to read & manipulate
(foo '[(+ 1 2) (+ 3 4)]) ; this is a reader shortcut for the above
(let [x 4]
(foo `[(+ 1 2) (+ 3 ~x)]) ; backquote is handy, and always fully-qualifies Var names
))
с результатом
-------------------------------
Clojure 1.10.1 Java 14
-------------------------------
Testing tst.demo.core
args => [(+ 1 2) (+ 3 4)]
args => [(+ 1 2) (+ 3 4)]
args => [(clojure.core/+ 1 2) (clojure.core/+ 3 4)]
Мы видим, что нам нужно только заключить в кавычки вектор переноса, а не каждый элемент внутри него. Это также показывает, что одиночная кавычка является ярлыком для чтения специальной формы (quote ...)
.
Последний пример показывает, что мы можем использовать синтаксическую кавычку (то есть обратную цитату). Это позволяет нам вставлять значения в шаблон как здесь x
. Поскольку он предназначен для макросов, он добавляет пространство имен ко всем ссылкам на Var (т. Е. Функция +
здесь).