2

次のScheme(R6RS)コードがあるとします。

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

そして、私は2つのレコードを作成します。

(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?(上記の最後の行を参照)。

eqv?6.1章では、レコードについて次のように述べています。

obj1とobj2が両方とも同じレコードタイプのレコードであり、レコードコンストラクターへの2つの別々の呼び出しの結果である場合、eqv?#fを返します。

コードでは、2つのレコードは、コンストラクターへの2つの別々の呼び出しの結果です。したがって、それらはできませんeqv?

スキームの一部の方言では、レコードに構造的同等性を使用できる場合があります。たとえば、Racket#:transparentでは、構造的な同等性を取得するようにレコードを宣言できます。標準のSchemeでこの動作を取得できるかどうかはわかりません。

于 2012-04-25T14:28:08.500 に答える
1

私はR6RSにあまり精通していませんが、グーグルですばやく検索すると、

ここで重要なのは可変性です:

obj1とobj2が両方とも同じレコードタイプのレコードであり、レコードコンストラクターへの2つの別々の呼び出しの結果である場合、eqv?#fを返します。

于 2012-04-25T12:30:14.013 に答える