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 cons
z1
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
.
Perché non si può indicare specificamente un'auto o un cdr di una coppia? Solo convenzione? – Aaron
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. –