似乎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)
这种评估看起来非常特殊。但我想我可能会很困惑。
有人能帮我更好地理解这里的模式吗?
发布于 2012-04-19 20:13:33
=是什么意思?您可以将其用于两种不同的事情:读取后的相等和计算后的相等。顺便说一句,在Lisp语言中,函数=
可以比较数字。
第一步是阅读
(list 'quote '5)
read > (LIST (QUOTE QUOTE) (QUOTE 5))
(list '' '5)
read > (LIST (QUOTE (QUOTE (QUOTE 5))))
(list ' 5)
read > (LIST (QUOTE 5))
(list 'oddp '5)
read > (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
另请注意,引号读宏字符'
读过空格。
'5
的读数与例如' 5
的读数相同。
但是将引号直接放在下一个表达式的前面,而不是空格,这是一个很好的风格。
第二步是评估
(LIST (QUOTE QUOTE) (QUOTE 5))
评估> (QUOTE 5)
漂亮打印> '5
(LIST (QUOTE (QUOTE (QUOTE 5))))
评估> ((QUOTE (QUOTE 5)))
漂亮打印> (''5)
(LIST (QUOTE 5))
评估> (5)
(LIST (QUOTE ODDP) (QUOTE 5))
评估> (ODDP 5)
发布于 2012-04-19 18:58:25
'X
和(quote X)
是等价的,第一个只是第二个的简写,打印机在序列化它时会使用这个简写。但在您的示例中没有发生实际的评估。(评估(quote X)
会得到X
)。
发布于 2012-04-20 07:26:30
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)
都是不同的对象,但是当将这些数据作为代码进行计算时,它们会产生相同的值。
https://stackoverflow.com/questions/10226219
复制相似问题