以下函數從的第150頁的經驗證示意圖通過變更每個列表的cdr來確定兩個列表是否具有相同的身份(即佔用相同的內存),然後檢查是否變化已經影響到這兩個:測試兩個對(cons單元格)是否相同
(define same?
(lambda (c1 c2)
(let ((t1 (cdr c1))
(t2 (cdr c2)))
(set-cdr! c1 1)
(set-cdr! c2 2)
(let ((v (= (cdr c1) (cdr c2))))
(set-cdr! c1 t1)
(set-cdr! c2 t2)
v))))
現在,如果我定義a_list
如下:
(define a_list (list 'a 'b 'c 'd))
和評估
(same? a_list (cdr a_list))
函數返回#f,調試器(Dr.)球拍)證實,這兩個名單 - 自第二個參數以來應該分享他們的大部分成員是第一個的真正子集 - 確實具有相同成員的不同副本。這怎麼可能?!
有關這個想法輕微的扭曲:
(set-cdr! (cddr a_list) a_list)
現在a_list
是週期性的。如果我用same?
測試這個函數,它只在兩個參數同相位時註冊#t,即(same? a_list a_list)
和(same? a_list (cdddr a_list))
。
[編輯答案是在接受後的評論鏈的底端]
**它檢查2對(即,兩個缺點細胞)是否在** 'same?'聲稱表明兩個對佔用相同的內存,但我不清楚該算法是如何區分與共享成員的對相同的對。 **您可以更加精確地瞭解您在DrRacket中的檢查方式嗎?** 我正在逐步使用R5RS中的調試程序代碼 – planarian
@Planarian(A。(BCD))!=(B。( CD))「這是'相同'檢查的*唯一*的東西。它並不關心自己在這些* cdr *列表中尋找共享結構。 –
@Planarian我加了一個解釋'same?'是如何工作的。 – soegaard