Scheme 计算表达式时,这两个使用引号和列表的表达式是否相同?

Scheme 计算表达式时,这两个使用引号和列表的表达式是否相同?,scheme,Scheme,在计算表达式(如导数)时,这两个使用引号和列表的表达式是否相同 intrepreter为以下两个输出相同的值: (define a '(+ 3 4)) (define b (list '+ 3 4)) a b (car a) (car b) 输出: => (+ 3 4) => (+ 3 4) + + 对于这些表达式: (define a '(+ 3 4)) (define b (list '+ 3 4)) 它们有相同的值吗?是的: (equal? a b) => #

在计算表达式(如导数)时,这两个使用引号和列表的表达式是否相同

intrepreter为以下两个输出相同的值:

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

a
b

(car a)
(car b)
输出:

=> (+ 3 4)

=> (+ 3 4)
+
+
对于这些表达式:

(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
考虑这个例子:

(define a '(+ 3 4))
(define b (list '+ 3 4))
(define c '(+ 3 4))
这里
a
将指向一个不可变的*列表
(+34)
b
将指向一个列表,其元素与
a
相同,但它是在对该语句求值时生成的(
a
可以在程序运行之前存在,因为它是一个常量,对于编译后的程序,其生成顺序和方式并不重要)。在
b
中,保证所有
cons
单元格都是新创建的且唯一的。因此
(等于a b);=>#t
(等式a b);=>#f

(等式a c)
的输出未定义。一些方案实现将创建一个新的不可变列表,而另一些方案实现将指向先前创建的相同列表,因为根据规范,它们都是不可变的

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