(list';quote';5)='';5而不是';(引号5)或';(';';5)?

(list';quote';5)='';5而不是';(引号5)或';(';';5)?,list,lisp,quote,List,Lisp,Quote,似乎Common Lisp确实以一种特殊的方式处理(列出'quote'x)。例如,(list'oddp'5)的值是”(oddp 5),而(list'quote'5)的值是'5。换句话说,quote函数似乎是经过计算的,即使它由于前面的quote而应该处于数据模式 比较以下表达式的值: 1. (list 'quote '5) = (list 'quote 5) = (quote '5) = ''5 2. (list '' '5) = '(''5) 3. (list ' 5)

似乎Common Lisp确实以一种特殊的方式处理
(列出'quote'x)
。例如,
(list'oddp'5)
的值是
”(oddp 5)
,而
(list'quote'5)
的值是
'5
。换句话说,quote函数似乎是经过计算的,即使它由于前面的quote而应该处于数据模式

比较以下表达式的值:

    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)
这种评价似乎非常独特。但我想我可能会很困惑

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

'X
(quote X)
是等效的,第一个是第二个的简写,打印机在序列化它时将使用该简写。但在您的示例中没有实际的评估。(评估
(quote X)
会给你
X
)。

'X
(quote X)
是等价的,第一个是第二个的简写,打印机在序列化它时将使用该简写。但在您的示例中没有实际的评估。(评估
(引用X)
会给你
X
)。

什么意思?您可以将其用于两种不同的事情:读取后的相等和计算后的相等。顺便说一句,在Lisp本身中,函数
=
比较数字

第一步是阅读

(列出'quote'5)
阅读>
(列出(引用)(引用5))

(列表''5)
阅读>
(列表(引用(引用5)))

(列表'5)
阅读>
(列表(引号5))

(列出“oddp”5)
阅读>
(列出(引用oddp)(引用5))

现在,
是一个读取宏。它转换下一个文本形式
'someform
读作
(引用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
相同

但是,将引号直接放在下一个表达式的前面是一种很好的方式,没有空格

第二步是评估

(列表(引号)(引号5))
eval>
(引号5)
prettyprint>
'5

(列表(引号(引号(引号(引号)5)))
eval>
((引号(引号)5)))
prettyprint>
(''5)

(列表(引号5))
eval>
(5)

(LIST(QUOTE ODDP)(QUOTE 5))
eval>
(ODDP 5)
什么是=的意思?您可以将其用于两种不同的事情:读取后的相等和计算后的相等。顺便说一句,在Lisp本身中,函数
=
比较数字

第一步是阅读

(列出'quote'5)
阅读>
(列出(引用)(引用5))

(列表''5)
阅读>
(列表(引用(引用5)))

(列表'5)
阅读>
(列表(引号5))

(列出“oddp”5)
阅读>
(列出(引用oddp)(引用5))

现在,
是一个读取宏。它转换下一个文本形式
'someform
读作
(引用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
相同

但是,将引号直接放在下一个表达式的前面是一种很好的方式,没有空格

第二步是评估

(列表(引号)(引号5))
eval>
(引号5)
prettyprint>
'5

(列表(引号(引号(引号(引号)5)))
eval>
((引号(引号)5)))
prettyprint>
(''5)

(列表(引号5))
eval>
(5)

(LIST(QUOTE ODDP)(QUOTE 5))
eval>
(ODDP 5)
Re:例如,
(LIST'ODDP'5)
的值是
”(ODDP 5)

不,不是。
(列表'oddp'5)
的值正好是
(oddp 5)
。没有报价。这是一个恰好和表达式
(oddp 5)
的值类似的对象。两者比较
相等

(equal '(oddp 5) (list 'oddp 5)) -> T
回复:虽然
(列表'quote'5)
的值为
'5

这也是不对的。
(列表'quote'5)
的值是对象
(quote 5)
,表示为
'5
。表达式
''5
将生成类似的对象

产生相同或相似对象的两个表达式并不总是同一事物
4
(+2 2)
(*2)
都是不同的对象,但当这些数据段被视为代码并进行计算时,它们会产生相同的值。

Re:例如,
(列表“oddp”5)
的值是
(oddp 5)

不,不是。
(列表'oddp'5)
的值正好是
(oddp 5)
。没有报价。这是一个恰好和表达式
(oddp 5)
的值类似的对象。两者比较
相等

(equal '(oddp 5) (list 'oddp 5)) -> T
回复:虽然
(列表'quote'5)
的值为
'5

这也是不对的。
(列表'quote'5)
的值是对象
(quote 5)
,表示为
'5
。表达式
''5
将生成类似的对象

产生id的两个表达式