似乎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)
评估看起来非常特殊.但我估计我可能会很困惑.
有人可以帮助我更好地理解这里的模式吗?
=是什么意思?您可以将它用于两个不同的事情:读取后的相等性和评估后的相等性.顺便说一句,在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)