2

假设我有以下方案(R6RS)代码:

(define-record-type typeA
 (fields
  (mutable A)))

我创建了两条记录:

(define X (make-typeA 123))
(define Y (make-typeA 123))

我不明白为什么(equal? X Y)(equal? (make-typeA 123) (make-typeA 123))返回#f

我阅读了 R6RS 标准(第 11.5 节),但我并没有真正理解它。

4

2 回答 2

5

来自R6RS

平等?谓词将对和向量视为具有传出边的节点,使用 string=? 比较字符串,使用 bytevector=? 比较字节向量(参见关于“字节向量”的库章节),并使用 eqv? 比较其他节点。

换句话说,您的使用equal?实际上只是在做同样的事情,eqv?因为这就是为记录指定的方式(参见上面的最后一行)。

第 6.1 章对记录有这样的说法eqv?

如果 obj1 和 obj2 都是相同记录类型的记录,并且是对记录构造函数的两次单独调用的结果,那么 eqv? 返回#f。

在您的代码中,这两条记录是对构造函数的两次单独调用的结果。因此他们不可能eqv?

Scheme 的某些方言可能允许您在记录上使用结构相等性。例如,在Racket中,您可以声明一条记录#:transparent以获得结构相等性。我不确定您是否可以在标准方案中获得这种行为。

于 2012-04-25T14:28:08.500 回答
1

我对 R6RS 不是很熟悉,但是快速的谷歌搜索表明

这里的关键是可变性

如果 obj1 和 obj2 都是相同记录类型的记录,并且是对记录构造函数的两次单独调用的结果,那么 eqv? 返回#f。

于 2012-04-25T12:30:14.013 回答