Twoje ostatnie założenie jest poprawne. Kropka wskazuje, gdzie znajduje się wartość wskaźnika, a całe podwójne pole, na które wskazuje strzałka, jest celem. Nie ma znaczenia, czy wskazuje na bok, górny środkowy, górny lewy czy górny prawy. To cała para to "adres" obiektu.
Nie można wskazać części obiektu bez uzyskania dostępu do jego części przy pomocy car
i cdr
. Drugi, który robisz, masz wszystko, co wskazano, a nie wskaźnik pośredni. (car '(a b)) ; ==> a
i a
nie ma żadnej istoty listy, która wciąż wskazuje na to, dopóki nie zostanie zebrane śmieci.
Mogliśmy zilustrować to tak zamiast:
[=#1|#3|#2]
[=#2|#3|()]
[=#3|a |#4]
[=#4|b |()]
Pierwsza wartość z = # jest lokalizacja samego pudełka, natomiast dwa następne są car
i cdr
. Powyżej, x
wskazuje adres # 3 i z1
na # 1. Zróbmy z2
[=#5|#6|#8]
[=#6|a |#7]
[=#7|b |()]
[=#8|#9|()]
[=#9|a |#10]
[=#10|b |()]
Jak widać, z2
wykorzystuje dwa więcej niż z1
cons
ponieważ nie używać tego samego obiektu jako obu elementów swojej liście, ale korzysta z pojedynczych list podobnie wyglądających.
Na rysunkach zarówno car
, jak i cdr
z z1
wskazują tę samą listę x
. z2
wskazuje dwie różne listy, ale elementy na tych listach są takie same.
Powodem tego jest to, że symbole są pojedyncze. Zatem masz tylko jeden obiekt symbolu dla a
i ocena 'a
w dwóch różnych miejscach będzie wskazywać na to samo a
. Inne singletons są #f
, #t
i ()
cons
zawsze tworzy nową parę i list
jest tylko procedura, która cons
razem argumenty. Tak więc ten sam kod w dwóch miejscach wyrażeń tworzy dwa różne obiekty, które wyglądają tak samo.
(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)
Dane objęte ofertą można uznać za utworzone wszystkie naraz przed uruchomieniem programu. Tak więc jest to niezdefiniowane.
(eq? '(a b) '(a b)) ; ==> #t or #f (undefined)
(eq? '(b c) (cdr '(a b c))) ; ==> #t or #f (undefined)
Powodem jest to, że system ten jest dozwolona, ale nie zobowiązany do ponownego wykorzystania tych danych w ten sam sposób, jak w strukturze z1
.
Dlaczego nie możesz wskazać konkretnie samochodu lub cdr pary? Tylko konwencja? – Aaron
Schemat (i Lisp) to nie C; nie ma adresów per se. Ma odniesienia do obiektów, które (koncepcyjnie) odnoszą się zawsze do całego obiektu, a nie do jego części. Tak więc odwołanie do obiektu do komórki-komórki odnosi się do całej komórki-komórki (nawet jeśli jest zwykle zaimplementowane jako wskaźnik do lokalizacji początku komórki-sań), odwołanie do obiektu do ciągu znaków odnosi się do całego ciągu znaków (i nie poszczególne znaki w ciągu), odwołanie do wektora odnosi się do całego wektora itp. –