假设我有以下方案(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 节),但我并没有真正理解它。
来自R6RS:
\n\n\n\n\n平等吗?谓词将对和向量视为具有传出边的节点,使用 string=? 要比较字符串,请使用 bytevector=? 比较字节向量(请参阅有关 \xe2\x80\x9cBytevectors\xe2\x80\x9d 的库章节),并使用 eqv?来比较其他节点。
\n
换句话说,您的使用equal?实际上只是做同样的事情,eqv?因为这就是它为记录指定的方式(请参见上面的最后一行)。
eqv?第 6.1 章对记录有这样的描述:
\n\n\n如果 obj1 和 obj2 都是相同记录类型的记录,并且是两次单独调用记录构造函数的结果,则 eqv? 返回#f。
\n
在您的代码中,这两条记录是对构造函数的两次单独调用的结果。因此他们不可能是eqv?。
Scheme 的某些方言可能允许您在记录上使用结构相等。例如,在Racket中,您可以声明一条记录以#:transparent获得结构相等。我不确定您是否可以在标准方案中得到这种行为。