Почему (список «цитата» х) оценивается как «х, а не (« х) или (цитата »х)? - PullRequest
5 голосов
/ 19 ноября 2010

Я пытаюсь изучить LISP и просматривал пример кода, где используется нечто похожее на следующий код:

(список 'цитата 5)

Это оценивается как '5 в REPL. Я ожидал, что это будет оценено как ('5) или (цитата 5)

Я пробую это в REPL CLISP.

Любая помощь будет оценена.

1 Ответ

6 голосов
/ 19 ноября 2010

Цикл чтения-оценки-печати сначала читает, а затем оценивает

'цитата читается как «символ, имя которого - QUOTE»

5 читается как «число 5»

Таким образом (цитата 5 из списка) оценивается как «создайте список, первым элементом которого является символ, имя которого - QUOTE, а вторым элементом - 5».

Результат этой оценки может быть записан как «(цитата 5)». «5» - это еще один способ сказать это, и принтер при некоторых (вероятно, большинстве) имплантациях lisp предпочтет распечатать более короткую форму вместо более длинной.

Когда вы изучаете этот материал, печатая в репле, вы должны помнить, что два этапа чтения и оценки различны, но цикл выполняет оба действия:

Попробуйте

* (read-from-string "(list 'quote 5)")
(LIST 'QUOTE 5)

чтобы сделать один шаг за раз, или

* (first (read-from-string "(quote 5)"))
QUOTE
* (second (read-from-string "(quote 5)"))
5
* (read-from-string "(quote 5)")
'5

чтобы убедить себя в том, что "(цитата 5)" и "5" - это одно и то же

...