2015-07-30 15 views
7

Schematy diagramów i diagramów struktury i interpretacji programów komputerowych (SICP) na rysunkach 3.16 i 3.17 nie wydają się być równoważne (wyłącznie w odniesieniu do wartości, nie do pamięci), nawet chociaż mówi, że są. ("Kiedy myślałem o postaci listy, z1 i z2 zarówno reprezentowania "ten sam" listę, ((a b) a b))", str 258.)Niespójne schematy bloków i wskaźników w SICP

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

SICP Schematy Z1 pary tak:

enter image description here

i Z2 tak:

enter image description here

strzałki na skali ir, z1, oba nie wydają się wskazywać na całą parę, x. Nawet nie wskazują na to samo, mimo że obie otrzymały tę samą parę (pamięć i wartość). chciałbym oceniać pierwszy schemat jak (a b), a drugie jako ((a b) a b)

mogę się domyślać, że każda strzałka jest faktycznie wskazując na całej pary, x, ale na rysunku 2.3 na stronie 98:

enter image description here

bardzo wyraźnie wskazuje na całe pudełko, wskazując na bok lub pomiędzy dwoma przedmiotami.

Czy rozumiem niepoprawnie diagramy skrzynek i wskaźników lub coś zupełnie innego?

Odpowiedz

5

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ż z1cons 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.

10

Za dużo czytasz. :-) Jeśli wskazuje na pole gdziekolwiek jest, załóżmy, że jest to wskaźnik do tej komórki. Nie możesz konkretnie wskazać części tego numeru jako car lub cdr.

+1

Dlaczego nie możesz wskazać konkretnie samochodu lub cdr pary? Tylko konwencja? – Aaron

+4

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. –