读SICP时,此问题出现了。 为什么(list 'quote '(abc))
作为被解释(R5RS在Dr.Racket)评估'(abc)
对于我来说,应该是(quote (abc))
例如(list 'quot '(abc))
被评价为(quot (abc))
什么是如此特别的'quote
?
Answer 1:
它也花了我一段时间来理解这个问题。 但是,这只是你的心地善良的Lisp解释显示(报价(ABC))在它的等价形式“(ABC)。 由于没有用于(quott(ABC))没有这样的等价/语法糖,它示出为是。
Answer 2:
这取决于你用什么Lisp的(计划,球拍,Common Lisp的,等等),但一般你会得到不同的行为,系统将接受'x
作为简写或句法糖 (quote x)
这两种形式的是完全等价的,它们的值是相同的:未计算的x
。 当结果出来的系统,有可能会选择第一种方式来打印,使结果更直观的用户。 类似的事情发生的cons
了。 例如,
(cons 1 2)
;=> (1 . 2)
因为这是该负面因素的细胞(对)的一般方式被打印。 然而,有一个为定义的特殊情况下,当对的第二部分是另一个列表(无论是空列表()
或另一对,这就是为什么我们有以下几点。我也写一点关于如何名单和利弊细胞被印在回答递归范围在Lisp中增加了一个周期Λ 。
(cons 1 '())
;=> (1)
(cons 1 '(2 3))
;=> (1 2 3)
现在,我已经写了上面的表达式的值 。 例如,表格的值 (cons 1 '(2 3))
是列表(1 2 3)
作为一个额外的复杂性,一些系统(我想有些语言是球拍博士,尤其是)不打印在交互提示形式的价值 ,而是打印会产生同样的一个形式(一定“相同”)值的解释。 例如,你可能会评估'(1 . 2)
看看输出(cons 1 2)
因为这是会产生相同值的另一种形式 。 这可能是有益的,如果你这样做有纯函数式编程引用透明 ,但如果你没有预料到,这可能会导致一些混乱。
一个好办法看到,我们得到的结果,我们应该,无论系统如何将它们打印 ,是考察他们。 我们预计, (list 'quote '(abc))
应该返回其列表car
是符号quote
,其cadr
是名单(abc)
这是我们获得(在球拍博士5.3语言的R 5个 RS):
> (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)
我们得到了类似的结果,如果我们使用'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)
唯一的区别是,在第一种情况下, display
显示其列表car
是符号quote
使用速记,可用于这类名单。 也就是说,不是显示, (quote (abc))
它显示'(a b c)
Answer 3:
'(abc)
和(quote (abc))
的其实是同一个不同的符号。 所以,如果你的Lisp打印较短的版本不感到惊讶。
一般而言'<something>
是相同的(quote <something>)
QUOTE
在Lisp中用来标记哪些应该评估自己的表达。 通常一个列表将是一个函数或宏调用和符号将是一个变量。 如果你要正确对待这些数据,需要引用它们。
由于(quote <something>)
用于经常在Lisp语言,缩略版'<something>
已被引入节省一点打字或阅读的...
Answer 4:
display
发出一些行为。 例如。 '(a . (b . (c . ())))
被显示(abc)
'quote
被显示quote
和或许'(quote xy)
被显示(quote xy)
而'(quote x)
显示'x
或(quote x)
哪一个取决于执行,但它们的含义相同。
随着数据(即引用,如(quote quote)
和它的abbrivation 'quote
)的评价结果,符号quote
是没有什么特别的,对于任何LISP,就像'+
和'potato
碰巧是符号+
和potato
。 引述时的意思,当没有报价事情的任何符号是没有什么特别的。