1

似乎 Common Lisp 确实(list 'quote 'x)以一种特殊的方式对待。例如, 的值为(list 'oddp '5)is'(oddp 5)而 的(list 'quote '5)值为''5。换句话说,由于前面的引用,即使它应该处于数据模式,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)

评价似乎非常奇特。但我想我可能会很困惑。

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

4

3 回答 3

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

另请注意,引号 readmacro 字符'读取空格。

'5读法与 example 相同' 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-19T12:13:33.203 回答
3

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

于 2012-04-19T10:58:25.083 回答
0

回复:例如,(list 'oddp '5)值为'(oddp 5)

不,不是。的值(list 'oddp '5)只是(oddp 5)。没有报价。这是一个恰好与表达式的值相似的对象'(oddp 5)。两者比较equal

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

回复:虽然 的(list 'quote '5)值为''5

这也是不对的。的值是表示为(list 'quote '5)的对象。该表达式将产生一个类似的对象。(quote 5)'5''5

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

于 2012-04-19T23:26:30.210 回答