平等的?和记录类型

Asl*_*986 3 scheme r6rs

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

(define-record-type typeA
 (fields
  (mutable A)))
Run Code Online (Sandbox Code Playgroud)

我创建了两条记录:

(define X (make-typeA 123))
(define Y (make-typeA 123))
Run Code Online (Sandbox Code Playgroud)

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

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

Asu*_*awa 6

来自R6RS

\n\n
\n

平等吗?谓词将对和向量视为具有传出边的节点,使用 string=? 要比较字符串,请使用 bytevector=? 比较字节向量(请参阅有关 \xe2\x80\x9cBytevectors\xe2\x80\x9d 的库章节),并使用 eqv?来比较其他节点。

\n
\n\n

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

\n\n

eqv?第 6.1 章对记录有这样的描述:

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n