(list'quote'5)=''5而不是'(引用5)或'(''5)的值是多少?

1 lisp list quote

似乎Common Lisp确实(list 'quote 'x)以特殊方式对待.例如,的值(list 'oddp '5)'(oddp 5)同时的值(list 'quote '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)
Run Code Online (Sandbox Code Playgroud)

评估看起来非常特殊.但我估计我可能会很困惑.

有人可以帮助我更好地理解这里的模式吗?

Rai*_*wig 8

=是什么意思?您可以将它用于两个不同的事情:读取后的相等性和评估后的相等性.顺便说一句,在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
Run Code Online (Sandbox Code Playgroud)

另请注意,引用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)