的“报价Lisp的含义(Meaning of 'quote in Lisp)

2019-10-19 03:28发布

SICP时,此问题出现了。 为什么(list 'quote '(abc))作为被解释(R5RSDr.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 。 引述时的意思,当没有报价事情的任何符号是没有什么特别的。



文章来源: Meaning of 'quote in Lisp
标签: scheme lisp sicp