2015-07-30 14 views
7

Sơ đồ hộp và con trỏ của Chương trình Máy tính (SICP) trong Hình 3.16 và 3.17 không xuất hiện tương đương (hoàn toàn đối với giá trị, không phải bộ nhớ) mặc dù nó nói rằng họ đang có. ("Khi nghĩ đến như một danh sách, z1z2 cả đại diện cho "giống" danh sách, ((a b) a b))", pg 258.)Biểu đồ hộp và con trỏ không nhất quán trong SICP

(define x (list 'a 'b)) 
(define z1 (cons x x)) 
(define z2 (cons (list 'a 'b) (list 'a 'b))) 

SICP sơ đồ các z1 cặp như thế này:

enter image description here

và z2 như thế này:

enter image description here

các mũi tên trong pa ir, z1, cả hai dường như không trỏ đến toàn bộ cặp, x. Họ thậm chí không chỉ đến cùng một điều, mặc dù cả hai đã nhận được cùng một (bộ nhớ và giá trị) cặp. tôi sẽ đánh giá sơ đồ đầu tiên như (a b), và thứ hai là ((a b) a b)

tôi có thể đoán rằng mỗi mũi tên là thực sự trỏ đến toàn bộ cặp, x, nhưng trong hình 2.3 trên trang 98:

enter image description here

nó rất rõ ràng trỏ đến toàn bộ một hộp bằng cách trỏ sang một bên hoặc ở giữa hai mục.

Tôi có hiểu rõ sơ đồ hộp và con trỏ không chính xác hoặc hoàn toàn khác?

Trả lời

5

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 carcdr. 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)) ; ==> aa 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à carcdr. Ở 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 carcdr 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()

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.

10

Bạn đang đọc quá nhiều vào đó. :-) Nếu nó trỏ vào hộp ở bất kỳ đâu, giả sử đó là con trỏ tới ô điều khiển đó. Bạn không thể chỉ rõ mục car hoặc cdr của nó.

+1

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

+4

Đề á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. –

Các vấn đề liên quan