2015-07-30 5 views
7

I diagrammi di box-and-pointer della struttura e dell'interpretazione dei programmi (SICP) nelle Figure 3.16 e 3.17 non sembrano equivalenti (puramente rispetto al valore, non alla memoria) anche se dice che lo sono. ("Quando pensato come un elenco, z1 e z2 entrambi rappresentano "lo stesso" lista, ((a b) a b))", pag 258.)Diagrammi di box-and-pointer incoerenti in SIC

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

SICP diagrammi i z1 pair come questo:

enter image description here

e z2 simili:

enter image description here

le frecce nella pa ir, z1, non entrambi sembrano puntare all'intera coppia, x. Non indicano nemmeno la stessa cosa, nonostante entrambi abbiano ricevuto la stessa coppia (memoria e valore). avrei valutare primo diagramma come (a b), e la seconda come ((a b) a b)

ho potuto intuire che ogni freccia è effettivamente rivolta verso la coppia tutta, x, ma in figura 2.3 a pagina 98:

enter image description here

indica chiaramente un'intera scatola puntando sul lato o tra due elementi.

Sono in grado di capire i diagrammi di box e puntatore in modo errato o qualcos'altro?

risposta

5

L'ultima ipotesi è corretta. Il punto indica dove si trova il valore del puntatore, l'intera casella doppia su cui punta la freccia è il bersaglio. Non importa se punta sul lato, in alto, in alto a sinistra o in alto a destra. È l'intera coppia che è "l'indirizzo" dell'oggetto.

Non è possibile puntare a una parte di un oggetto senza accedere a una parte con car e cdr. Il secondo che fai hai ciò che è stato puntato e non un puntatore indiretto. (car '(a b)) ; ==> a e a non hanno alcuna essenza dell'elenco che ancora lo sta indicando fino a quando non viene raccolto.

Potremmo illustrare come questo, invece:

[=#1|#3|#2] 
[=#2|#3|()] 
[=#3|a |#4] 
[=#4|b |()] 

Il primo valore con = # è la posizione della scatola stessa, mentre il prossimo due sono car e cdr. Sopra, x punti all'indirizzo 3 e z1 al numero 1. Facciamo z2

[=#5|#6|#8] 
[=#6|a |#7] 
[=#7|b |()] 
[=#8|#9|()] 
[=#9|a |#10] 
[=#10|b |()] 

Come si può vedere, z2 utilizza due in più rispetto consz1 poiché non riutilizzare lo stesso oggetto in quanto entrambi gli elementi della sua lista, ma utilizza singole liste simili di aspetto.

Nei disegni, sia car e cdr di z1 punto alla medesima lista x. z2 punta a due elenchi diversi, ma gli elementi in questi elenchi sono gli stessi.

Il motivo è che i simboli sono singleton. Pertanto, si dispone di un solo oggetto simbolo per a e la valutazione di 'a in due posizioni diverse punterà allo stesso a. Altri single sono #f, #t e ()

cons crea sempre un nuovo paio e list è solo una procedura che cons insieme gli argomenti. Quindi lo stesso codice (list 'a 'b) in due punti nell'espressione rende due oggetti diversi che sembrano uguali.

(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) 

I dati quotati possono essere visualizzati come creati tutto in una volta prima dell'avvio del programma. Quindi questo non è definito.

(eq? '(a b) '(a b))   ; ==> #t or #f (undefined) 
(eq? '(b c) (cdr '(a b c))) ; ==> #t or #f (undefined) 

Il motivo è che Scheme è permesso, ma non obbligato, riutilizzare dati allo stesso modo con la struttura z1.

10

Stai leggendo troppo. :-) Se punta nella casella ovunque, supponiamo che sia un puntatore a quella cella. Non è possibile puntare in modo specifico alla porzione car o cdr di esso.

+1

Perché non si può indicare specificamente un'auto o un cdr di una coppia? Solo convenzione? – Aaron

+4

Scheme (e Lisp) non è C; non ha indirizzi di per sé. Ha riferimenti a oggetti, che (concettualmente) si riferiscono sempre a un intero oggetto, non a parti di esso. Quindi, un riferimento a un oggetto con una cella cons si riferisce all'intera cella (anche se è tipicamente implementato come puntatore alla posizione dell'inizio della cella), un riferimento a una stringa si riferisce all'intera stringa (e non singoli caratteri nella stringa), un riferimento a un vettore si riferisce all'intero vettore, ecc. –

Problemi correlati