Различные специальные символы в clojure являются аббревиатурами для вещей
(quote (a b))
совпадает с '(a b)
как вы можете видеть, оценив:
user> ''(a b)
(quote (a b))
Это, кажется, синтаксис как аббревиатура, который поражает меня как прекрасную идею.
Но синтаксическая цитата, `, кажется особенной. Я не могу думать, что было бы эквивалентно
`(a b)
Я бы догадался, что-то вроде (syntax-quote (a b))
, но это не сработает, и если я только догадался, я не могу узнать, что он действительно назвал.
user> '`(a b)
(clojure.core/seq (clojure.core/concat (clojure.core/list (quote user/a)) (clojure.core/list (quote user/b))))
Немного мистифицирует.
Предположительно читатель делает что-то особенное, может быть, потому, что ему нужно знать пространства имен?
Интересно, что специальный синтаксис, используемый в цитате синтаксиса, работает так, как я ожидал:
user> '~a
(clojure.core/unquote a)
user> '[email protected]
(clojure.core/unquote-splicing a)
user> '~'a
(clojure.core/unquote (quote a))
кроме этого:
user> 'a#
a#
Я бы подумал, что это что-то вроде (unquote (gensym "a"))
Я понимаю, что здесь я немного неловкий, и я должен просто пойти и прочитать код. Если кто-то не хочет объяснять, что происходит или дает ссылку, может ли кто-нибудь дать мне подсказку о том, как найти соответствующий код и что искать?