0

プチ シェ スキーム (スレッド) で。myq と myqq という名前の 2 つのリストを定義しました。

(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)結果が になるのかわかりません。myqq の車を変更することはないので、((b) b)結果は になるはずです。((ignored) b)

4

2 に答える 2

2

同等?同一という意味ではありません。基本的に、これら 2 つの値は同じですか? もしそうなら、それらは同じですか?それらが値のリストである場合、これらのリストの各要素は、対応するリストと同じ値を持っていますか?

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

それは理にかなっていますよね?

これは、コンス セルがポインターのペアであるという事実に関係しています。

定義するときmyqq、名前を値「ignored」にバインドしますend。これは、内部的にはシンボルであり、値「ignored」を持つメモリ位置を指すポインターに関連付けられています。の値を返すときmyqq、それはペアを指す名前です。このペアは 2 つのポインターであり、どちらも end のポインターが指していたのと同じ場所を指しています。set-cdr!cdr ポインタが指す位置のメモリの値を変更します。この場合myqq、車が指していた場所にもあったので、両方を変更します。とはそれぞれmyq、無視された値がロードされた独自のメモリ位置を指しています。carcdr

svk で指摘されているように、eq?ポインターを比較することで等しいかどうかをテストします。

于 2013-10-23T14:09:08.530 に答える