"Lisp中的引用"的含义

Gra*_*ate 1 lisp scheme sicp

在阅读SICP时出现了这个问题.为什么要(list 'quote '(a b c))由解释(评估R5RSDr.Racket)作为'(a b c).对我来说应该是(quote (a b c)).例如,(list 'quot '(a b c))被评估为(quot (a b c)).有什么特别的'quote

Jos*_*lor 6

你会取决于你使用什么Lisp的(计划,球拍,Common Lisp的,等等),但在一般情况下,系统将接受获得不同的行为'x作为一个速记语法糖(quote x).这两种形式完全相同,它们的价值是相同的:未评估的x.当结果从系统中出来时,它可能选择以第一种方式打印,以使结果对用户更直观.类似的事情也发生cons了.例如,

(cons 1 2)
;=> (1 . 2)
Run Code Online (Sandbox Code Playgroud)

因为这是印刷细胞(对)的一般方式.然而,有一个特殊的情况定义为当该对的第二部分是另一个列表(空列表()或另一对,这就是为什么我们有以下.我还写了更多关于列表和缺点单元是如何印刷在回答在Lisp中递归范围增加了一个周期Λ.

(cons 1 '())
;=> (1)

(cons 1 '(2 3))
;=> (1 2 3)
Run Code Online (Sandbox Code Playgroud)

现在,我已经写了上面表达式的.例如,表单的(cons 1 '(2 3))是列表(1 2 3).作为一个额外的复杂功能,一些系统(我正在考虑某些语言,特别是Dr.Batet)不会在交互式提示中打印表单的,而是打印一个可以产生相同形式的表单(对于某些对"相同")值的解释.例如,您可以评估'(1 . 2)并查看输出,(cons 1 2)因为这是另一种会产生相同值的表单.如果您正在进行具有参考透明度的函数式编程,这可能会有所帮助,但如果您不期望它,则可能会导致一些混淆.

无论系统如何打印它们,我们都应该看到我们应该得到的结果是检查它们的好方法.我们预计,(list 'quote '(a b c))应该返回其列表car是符号quote,其cadr在该列表(a b c).这就是我们得到的(使用语言R 5 RS的Dr. Racket 5.3 ):

> (display (list 'quote '(a b c)))
'(a b c)
> (display (car (list 'quote '(a b c))))
quote
> (display (cadr (list 'quote '(a b c))))
(a b c)
Run Code Online (Sandbox Code Playgroud)

如果我们使用'qmmmt而不是'quote:我们得到类似的结果:

> (display (list 'qmmmt '(a b c)))
(qmmmt (a b c))
> (display (car (list 'qmmmt '(a b c))))
qmmmt
> (display (cadr (list 'qmmmt '(a b c))))
(a b c)
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,在第一种情况下,使用可用于此类列表的速记display显示car符号quote列表.也就是说,而不是显示(quote (a b c))'(a b c).