2012-04-19 4 views
1

Кажется, что Common Lisp делает особый подход к (list 'quote 'x). Например, значение (list 'oddp '5) равно '(oddp 5), а значение (list 'quote '5) - ''5. Другими словами, функция котировки, по-видимому, оценивается, хотя она должна быть в режиме данных из-за цитаты перед ней.Каково значение (list 'quote' 5) = '' 5, а не '(цитата 5) или' ('' 5)?

Сравните значение следующих выражений:

1. (list 'quote '5) = (list 'quote 5) = (quote '5) = ''5 
    2. (list '' '5) = '(''5) 
    3. (list ' 5) = (list 5) = '(5) 
    4. (list 'oddp '5) != (oddp 5) 

Оценка представляется очень своеобразные. Но я считаю, что могу быть очень смущен.

Может кто-нибудь помочь мне лучше понять шаблон здесь?

ответ

8

Что делает = означает? Вы можете использовать его для двух разных вещей: равенства после чтения и равенства после оценки. Btw., В самом Lisp функция = сравнивает числа.

Первый шаг чтения:

(list 'quote '5) чтения>(LIST (QUOTE QUOTE) (QUOTE 5))

(list '' '5) чтения>(LIST (QUOTE (QUOTE (QUOTE 5))))

(list ' 5) чтения>(LIST (QUOTE 5))

(list 'oddp '5) чтения>(LIST (QUOTE ODDP) (QUOTE 5))

В настоящее время ' является прочитанным макросом. Он преобразует следующую текстовую форму. 'someform только что прочитано как (QUOTE SOMEFORM). При печати принтер может повторно преобразовать его. Обратите внимание, как он взаимодействует с красивой печатью. В следующем примере в LispWorks:

CL-USER 50 > '(QUOTE SOMEFORM) 
(QUOTE SOMEFORM) 

CL-USER 51 > (setf *print-pretty* t) 
T 

CL-USER 52 > '(QUOTE SOMEFORM) 
'SOMEFORM 

Следует также отметить, что цитата readmacro символ ' читает над пробелами.

'5 читается так же, как, например, ' 5.

Но это хороший стиль, чтобы поставить цитату непосредственно перед следующим выражением, без пробелов.

Вторым шагом является оценка:

(LIST (QUOTE QUOTE) (QUOTE 5)) Eval>(QUOTE 5) prettyprint>'5

(LIST (QUOTE (QUOTE (QUOTE 5)))) Eval>((QUOTE (QUOTE 5))) prettyprint>(''5)

(LIST (QUOTE 5)) Eval>(5)

(LIST (QUOTE ODDP) (QUOTE 5)) Eval>(ODDP 5)

3

'X и (quote X) эквивалентны, первый - это просто сокращение для второго, и принтер будет использовать это сокращение при его сериализации. Но в вашем примере фактической оценки не произошло. (Оценка (quote X) даст вам X).

+0

Я немного смущен тем, что '' quote' и '(quote quote)' эквивалентны и оба оцениваются как 'quote'. Но когда используется как параметр функции 'list', тогда' (list 'quote' quote) 'оценивает' 'quote'. Кроме того, '(list 'x)' обычно оценивает '(x)', то есть '(cons' x())', а не просто 'x'. – anonemba

+1

'' quote' is ** не ** эквивалентно 'quote'. Как сказал Райнер, ваши примеры очень неряшливы в оценке. – Marijn

0

Re: Например, значение (list 'oddp '5) является '(oddp 5)

Нет, это не так. Значение (list 'oddp '5) составляет всего (oddp 5). Нет цитаты. Это объект, который действительно похож на значение выражения '(oddp 5). Два сравнить equal:

(equal '(oddp 5) (list 'oddp 5)) -> T 

Re: в то время как значение (list 'quote '5) является ''5.

Это тоже не так. Значение (list 'quote '5) - это объект (quote 5), который обозначается как '5. Выражение ''5 будет производить аналогичный объект.

Два выражения, которые производят идентичные или похожие объекты, не всегда одно и то же. 4, (+ 2 2) и (* 2 2) - все разные объекты, но когда эти части данных обрабатываются как код и оцениваются, они дают одно и то же значение.

+0

'(list 'quote' 5)' оценивает '(quote '5)' (т.е. ''' 5' not '(quote 5)' – tobyodavies

+0

В обоих ANSI Common Lisp и Scheme '(list 'quote' 5)' оценивает значение '(quote 5)'. Вы должны использовать какой-либо другой диалект. – Kaz

+0

@tobydavies Вы все еще считаете, что '(list 'quote' 5)' производит '(quote '5)'? – Kaz