因为 (list 1 2 3) 返回的结果是 (1 2 3),而 (quote (1 2 3)) 也返回了相同的结果 (1 2 3),那么为什么需要同时存在这两种方式呢?
Scheme 语言非常简洁,因此这两种方式必定有一些意义上的差异。那是什么呢?
因为 (list 1 2 3) 返回的结果是 (1 2 3),而 (quote (1 2 3)) 也返回了相同的结果 (1 2 3),那么为什么需要同时存在这两种方式呢?
Scheme 语言非常简洁,因此这两种方式必定有一些意义上的差异。那是什么呢?
在你提到的例子中,quote
和 list
具有相同的结果,因为数字常量会被自动求值。如果在列表中使用不是自我求值的表达式(例如变量或函数调用),则会看到区别:
(quote (a b c))
将给你一个包含符号 a
、b
和 c
的列表,而 (list a b c)
将给你一个包含变量 a
、b
和 c
的值的列表(如果变量不存在,则会出现错误)。
List创建一个列表,因此(list 1 2 3)创建了一个三元素列表。
Quote防止评估。如果没有引用,表达式(1 2 3)将被评估为函数1调用参数2和3,这显然是没有意义的。Quote防止评估并只返回列表,该列表在其外部可打印形式中指定为(1 2 3)。
list
实际上是一个可以由Scheme自己定义的派生形式:(define (list . objs) objs)
。" - Justin Ethier