2013-10-23 26 views
0

在嬌小的Chez計劃(線程)。我定義了兩個名爲myq和myqq的列表。Petite Chez Scheme(線程)這兩個列表之間有什麼不同?

(define make-queue 
    (lambda() 
    (let ((end (cons 'ignored '()))) 
     (cons end end)))) 

(define myqq (make-queue)) 
(define myq '((ignored) ignored)) 

;this shows myq and myqq are equal 
(display (equal? myqq myq)) 
(newline) 

;test myqq 
(display myqq) 
(newline) 
(set-car! (cdr myqq) 'b) 
(display myqq) 
(newline) 

;test myq 
(display myq) 
(newline) 
(set-car! (cdr myq) 'b) 
(display myq) 
(newline) 

這就是結果:

#t 
((ignored) ignored) 
((b) b) 
((ignored) ignored) 
((ignored) b) 

我的問題是:作爲

(display (equal? myqq myq)) 

顯示MYQ和MYQQ是相等的。爲什麼要做同樣的命令:

(set-car! (cdr myqq) 'b) 
(set-car! (cdr myq) 'b) 

導致不同的結果? 另外,我不知道爲什麼(set-car! (cdr myqq) 'b)結果在((b) b)。我認爲這應該導致((ignored) b),因爲我們從來沒有改變myqq的車!

我很生氣....任何幫助將不勝感激。提前致謝。

+0

不完全重複,但請注意,修改文字(例如引號)數據通常不是一個好主意:[意外的數據持久性](http://stackoverflow.com/q/18790192/1281433) –

回答

1

make-queue結果是由缺點細胞,而不是三個的結構:

  • 一個cons單元分別包含在carcdrignored()
  • 另一個cons單元在其car及其cdr中包含指向第一個單元格的鏈接。

當你做(set-car! (cdr myqq) 'b),你改變第一cons單元的car(因爲這是在(cdr myqq)引用)從ignoredb

equal?遞歸檢查對和類似結構,最終將eqv?應用於原始值(在您的case符號中)。它不包括myqq中不同組件之間存在結構共享這一事實,並且myq的情況並非如此,這是相關差異。

equal?不是關於平等的最後一個字,它只是一個特殊的(並且通常是有用的)意義,其中兩個結構可以相等。您可以使用其他比較函數來查看兩個結構之間存在差異,例如:

>>> (eq? (car myqq) (cdr myqq)) 
#t 
>>> (eq? (car myq) (cdr myq)) 
#f 
+0

但myq和myqq有什麼區別?因爲通過'equal?'它們是相同的。 – tcpiper

+0

@Pythoner不,他們不一樣,只是在那一刻他們有相同的價值觀。 – WorBlux

2

等於?並不意味着完全相同。同樣基本問題是這兩個東西的價值?如果是這樣,他們是一樣的嗎?如果它們是值的列表,那麼這些列表中的每個元素是否具有與相應列表相同的值。

(define example 'ignored) 
(equal? 'ignored example) -> #t 
(set! example 'b) 
(equal? 'ignored example) -> #f 

這很合理吧?

它與cons單元是一對指針的事實有關。

當您定義myqq時,您將名稱end綁定爲值「忽略」,其內部是一個符號,與指向某個存儲單元的指針相關聯,其值爲'ignored'。當返回myqq的值時,它是一個指向一對的名稱,這對是兩個指針,它們都指向與末尾指針所指向的位置相同的位置。 set-cdr!更改由cdr指針指向的位置處的內存值。在myqq的情況下,這也是汽車指向的位置,所以你改變了兩者。在myq中,carcdr均指向加載了「忽略」值的其自己的內存位置。

正如svk eq?指出的那樣,通過比較指針來測試相等性。

+0

我喜歡這個代碼示例。儘管如此,展示它如何應用於結構可能也不錯。例如'(定義例(cons 1 2))(等於例(cons 1 2))(set-car!...)...'。 –