Некоторые выходные данные CLISP REPL:
[1]> (list 'list 1 2 3)
(LIST 1 2 3)
[2]> (list 'list '(1 2 3))
(LIST (1 2 3))
[3]> (list 'quote 1 2 3)
(QUOTE 1 2 3)
[4]> (list 'quote '(1 2 3))
'(1 2 3)
Первые три, я точно понимаю, что происходит: функции list
передается символ ('list
или 'quote
), поэтому в результате получается список, который начинается с символа list
или quote
. Меня смущает четвертый. Почему не возвращается (QUOTE (1 2 3))
?
Я понимаю, что если вы введете (QUOTE '(1 2 3))
в REPL, вы получите '(1 2 3)
обратно, так что выражения эквивалентны в этом смысле. Но (LIST 1 2 3)
эквивалентно (1 2 3)
, и все же первое выражение этого не возвращает.
Кажется несостоятельным, что (list 'quote 1 2 3)
возвращает список с первым элементом, являющимся символом quote
, а (list 'quote (1 2 3))
возвращает список в кавычках. Тем более, что такие выражения, как (list 'list ...)
, похоже, всегда возвращают список, начинающийся с символа - пока, по крайней мере, quote
является единственным подобным «особым случаем».
Это не самый простой вопрос, чтобы сформулировать его, поэтому я надеюсь, что мне удалось выразить свое замешательство. Может ли кто-нибудь объяснить, почему цитата трактуется таким, казалось бы, уникальным способом?