Вам не хватает шага оценки.
Давайте сначала посмотрим на простую цитату:
user=> 'a
a
user=> ''a
(quote a)
user=> '''a
(quote (quote a))
user=> ''''a
(quote (quote (quote a)))
и так далее. Это довольно просто, потому что не нужно обрабатывать форму в кавычках, кроме как читать ее.
'a
читается как (quote a)
, что соответствует символу a
.
''a
читается как '(quote a)
, что читается как (quote (quote a))
, что соответствует списку (quote a)
, который является списком из двух символов quote
и a
.
И т. Д.
Теперь, что `
делает, а '
нет? Это более или менее шаблонный механизм, который
- автоматически определяет символы
- автоматически обрабатывает auto-gensym
- оценивает вещи, отмеченные
~
(или ~@
) и повторно вставляет результаты.
Это означает, что он не может просто создать другую форму quote
, содержащую следующую форму, но должен создать фактическую форму вызова функции на сайте вызова (кроме случаев, когда тривиальные случаи). Эта форма будет в основном состоять из последовательных операций (list
, cons
, concat
и c.) Для сборки частей шаблона с оцененными битами. Если вы снова цитируете это, вы увидите эти формы вызова функций.