在评估表达式时,这两个表达式是否使用引号和列表相同?

时间:2014-09-18 14:45:33

标签: scheme

这两个表达式在评估表达式时是否使用引号和列表相同,如衍生物?

intrepreter为两者输出相同的值:

(define a '(+ 3 4))
(define b (list '+ 3 4))

a
b

(car a)
(car b)

输出:

=> (+ 3 4)

=> (+ 3 4)
+
+

2 个答案:

答案 0 :(得分:2)

对于这些表达式:

(define a '(+ 3 4))
(define b (list '+ 3 4))

他们有相同的价值吗?是:

(equal? a b)
=> #t

他们是指同一个对象吗?无:

(eq? a b)
=> #f

我想你想要以某种方式处理列表(比如,计算衍生物)。只要您只对将它们视为符号列表感兴趣并且您可以安全地在任一表示之间来回切换,那么创建列表的方式并不重要。如果您将运营商视为实际的程序,情况会有所不同,这些是不同的事情:

(define a '(+ 3 4))
(define b (list + 3 4)) ; quote was removed
(equal? a b)
=> #f

答案 1 :(得分:0)

考虑这个例子:

(define a '(+ 3 4))
(define b (list '+ 3 4))
(define c '(+ 3 4))

此处a将指向不可变的*列表(+ 3 4)b将指向一个列表,其元素与a相同,但在评估该语句时会生成它(a可以在程序运行之前存在,因为它{&#39} sa常量和编译程序的顺序及其生成方式并不重要。在b中,您可以保证所有cons单元格都是新创建且唯一的。因此(equal? a b) ; ==>#t(eq? a b) ; ==> #f

(eq? a c)的输出未定义。一些Scheme实现将创建一个新的不可变列表,而其他一些将指向先前创建的相同列表,因为它们根据规范是不可变的。

*由Scheme标准中的规范不可改变,但很少强制执行,因此许多实现允许您使用未定义的行为更改不可变数据。