Giả định cuối cùng của bạn là chính xác. Dấu chấm cho biết giá trị con trỏ ở đâu, toàn bộ hộp đôi mà mũi tên trỏ đến là đích. Nó không quan trọng nếu nó chỉ về phía bên, trên cùng giữa, trên cùng bên trái hoặc trên bên phải. Đó là toàn bộ cặp đó là "địa chỉ" của đối tượng.
Bạn không thể trỏ đến một phần của đối tượng mà không truy cập phần của nó với car
và cdr
. Thứ hai bạn làm điều đó bạn có bất cứ điều gì nó được trỏ đến và không phải là một con trỏ gián tiếp. (car '(a b)) ; ==> a
và a
không có bất kỳ bản chất nào của danh sách vẫn đang trỏ đến nó cho đến khi nó được thu thập rác.
Chúng ta có thể minh họa cho nó giống như thay vì điều này:
[=#1|#3|#2]
[=#2|#3|()]
[=#3|a |#4]
[=#4|b |()]
Giá trị đầu tiên với = # là vị trí của bản thân hộp, trong khi hai tiếp theo là car
và cdr
. Ở trên, x
trỏ đến địa chỉ # 3 và z1
đến # 1. Hãy làm cho z2
[=#5|#6|#8]
[=#6|a |#7]
[=#7|b |()]
[=#8|#9|()]
[=#9|a |#10]
[=#10|b |()]
Như bạn thấy, z2
sử dụng thêm hai cons
hơn z1
vì nó không tái sử dụng các đối tượng tương tự như cả hai yếu tố của danh sách, nhưng sử dụng danh sách tương tự nhìn cá nhân.
Trong bản vẽ, cả hai car
và cdr
của z1
trỏ đến cùng một danh sách x
. z2
trỏ đến hai danh sách khác nhau, nhưng các phần tử trong các danh sách đó giống nhau.
Lý do cho điều này là biểu tượng là những người độc thân. Do đó, bạn chỉ có một đối tượng biểu tượng cho a
và đánh giá 'a
ở hai vị trí khác nhau sẽ cùng trỏ đến cùng một a
. độc thân khác là #f
, #t
và ()
cons
luôn tạo ra một người năng nổ và list
chỉ là một thủ tục mà cons
cùng các đối số. Vì vậy, cùng một mã số (list 'a 'b)
hai vị trí trong biểu thức làm cho hai đối tượng khác nhau trông giống nhau.
(eq? (car z1) (cdr z1)) ; ==> #t same object
(eq? (car z2) (cdr z2)) ; ==> #f not same object
(equal? (car z2) (cdr z2)) ; ==> #t they look the same, but they are not the same. (created at different places)
Dữ liệu được trích dẫn có thể được xem cùng lúc trước khi chương trình bắt đầu. Vì vậy, điều này là không xác định.
(eq? '(a b) '(a b)) ; ==> #t or #f (undefined)
(eq? '(b c) (cdr '(a b c))) ; ==> #t or #f (undefined)
Lý do là Đề án được cho phép, nhưng không bắt buộc, để tái sử dụng dữ liệu theo cách tương tự như với cấu trúc z1
.
Tại sao bạn không thể trỏ đến ô tô hoặc cdr của một cặp cụ thể? Chỉ quy ước? – Aaron
Đề án (và Lisp) không phải là C; nó không có địa chỉ. Nó có các tham chiếu đối tượng, trong đó (khái niệm) luôn đề cập đến toàn bộ một đối tượng, không phải là các phần của chúng. Vì vậy, một tham chiếu đối tượng tới một ô khuyết điểm tham chiếu đến toàn bộ ô khuyết điểm (ngay cả khi nó thường được thực hiện như một con trỏ đến vị trí bắt đầu của ô khuyết điểm), một tham chiếu đối tượng đến một chuỗi tham chiếu đến toàn bộ chuỗi (và không các ký tự riêng lẻ trong chuỗi), một tham chiếu đối tượng đến một vectơ tham chiếu đến toàn bộ vectơ, v.v. –