Несколько синтаксических кавычек - PullRequest
2 голосов
/ 07 марта 2020

`a` `a и` `` a дает следующее

user=> `a
user/a
user=> ``a
(quote user/a)
user=> ```a
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote quote)) (clojure.core/list (quote user/a))))

Так как `a дает user / a, я бы предположил, что` `a - это то же самое, что` user / a, что это пользователь / а.

1 Ответ

1 голос
/ 07 марта 2020

Вам не хватает шага оценки.

Давайте сначала посмотрим на простую цитату:

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.) Для сборки частей шаблона с оцененными битами. Если вы снова цитируете это, вы увидите эти формы вызова функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...