tôi chút nhầm lẫn bởi kết quả của ví dụ này:bộ xe hơi! và để trong ngôn ngữ chương trình
(define mk-q
(lambda()
(let ([l '(x)])
(cons l l))))
(define q (mk-q))
q
=> ((x) x)
(set-car! (cdr q) 'y)
=> ((y) y)
Tôi tự hỏi tại sao cả hai x
nguyên tử đã được thay thế bởi set-car!
thủ tục (đoán đầu tiên của tôi cho những gì kết quả sẽ là ((x) y)
)?
Ví dụ:
(define mk-q2
(lambda()
(let ([l '(x)])
(cons l (cons l l)))))
(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!
Tại sao đều x
s trong ví dụ đầu tiên thay thế?
Bởi vì về cơ bản một tế bào khuyết điểm là hai con trỏ đến giá trị. Khi bạn viết '(cons l l)' bạn tạo hai con trỏ tới cùng một đối tượng. Khi bạn thay đổi đối tượng, cả hai mục vẫn trỏ đến cùng một đối tượng. –
Ban đầu tôi đọc nhầm điều này như là set-carl, điều thú vị trong một loại thiếu niên đói. – Bill