为什么Scheme语言同时拥有list和quote?

12

因为 (list 1 2 3) 返回的结果是 (1 2 3),而 (quote (1 2 3)) 也返回了相同的结果 (1 2 3),那么为什么需要同时存在这两种方式呢?

Scheme 语言非常简洁,因此这两种方式必定有一些意义上的差异。那是什么呢?


"由于Scheme本身非常简洁,你可能会感兴趣知道list实际上是一个可以由Scheme自己定义的派生形式:(define (list . objs) objs)。" - Justin Ethier
2个回答

27

在你提到的例子中,quotelist 具有相同的结果,因为数字常量会被自动求值。如果在列表中使用不是自我求值的表达式(例如变量或函数调用),则会看到区别:

(quote (a b c)) 将给你一个包含符号 abc 的列表,而 (list a b c) 将给你一个包含变量 abc 的值的列表(如果变量不存在,则会出现错误)。


5

List创建一个列表,因此(list 1 2 3)创建了一个三元素列表。

Quote防止评估。如果没有引用,表达式(1 2 3)将被评估为函数1调用参数2和3,这显然是没有意义的。Quote防止评估并只返回列表,该列表在其外部可打印形式中指定为(1 2 3)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接