2012-04-25 80 views
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標準(section 11.5),但我並不是很瞭解它。

回答

4

R6RS

平等?謂詞將對和向量視爲具有輸出邊的節點,使用string =?比較字符串,使用bytevector =?比較字節向量(參見關於「Bytevectors」的庫章節),並使用eqv?比較其他節點。

換句話說,你的equal?使用真的只是在做同樣的事情,eqv?因爲這是它是如何備案規定(見上文最後一行)。

6.1章有這樣說的記錄eqv?

如果OBJ1和OBJ2是同一記錄類型的兩個記錄,並且是兩個單獨的呼叫至創紀錄的構造函數的結果,然後當量?返回#f。

在你的代碼中,這兩個記錄是對構造函數的兩次單獨調用的結果。因此他們不能是eqv?

Scheme的某些方言可能允許您在記錄上使用結構相等。例如,在Racket中,您可以聲明一個記錄爲#:transparent以獲得結構相等。我不確定你可以在標準Scheme中獲得這種行爲。

1

我不是很熟悉R6RS,但快速谷歌搜索顯示,

關鍵的還是這裏是mutability

如果OBJ1和OBJ2是同一記錄類型的兩個記錄,並且是兩個獨立調用記錄構造函數的結果,然後eqv? 返回#f。

+0

那麼,首先感謝你的回答,我同意'eqv?'返回FALSE,因爲只有當對象是同一個對象時它才爲TRUE。例如。 '(eqv?(list 1 2 3)(list 1 2 3))'returns FALSE,but'(equal?(list 1 2 3)(list 1 2 3))'返回TRUE,因爲它們具有相同的形狀「 – Aslan986 2012-04-25 12:44:33

+0

我也嘗試過定義一個新的記錄類型'typeB',它是'typeA'的副本,除了字段是'immutable'但是(等於?(make-typeB 123)(make-typeB 123 ))'仍然是FALSE。 – Aslan986 2012-04-25 12:51:52

相關問題