SICP

2015-07-30 21 views
7

'daki Bilgisayar Programlarının Yapısı ve Yorumlanması (SICP) 'nin Şekil 3.16 ve 3.17'deki kutu ve işaretçi şemaları, eşdeğeri (tamamen değil, belleğe göre) eşdeğer görünmüyor. Gerçi öyle diyorlar. (Sf aynı "listesi, ((a b) a b)) "" Listeden, olarak düşünülebilir zaman z1 ve z2 hem temsil" 258.)SICP

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

SICP böyle çifti Z1 diyagramlar:

enter image description here

böyle

ve z2: pa

enter image description here

oklar ir, z1, yapma hem tüm çifti, x işaret gibi görünüyor. Her ikisi de aynı (hafıza ve değer) çiftine sahip olmasına rağmen, aynı şeyi işaret etmiyorlar bile.

enter image description here

: Ben (a b) olarak ilk diyagramı ve ((a b) a b)

Her ok aslında şekil 2.3'te sayfa 98 tüm çifti, x işaret ederek, ancak tahmin olabilir gibi ikinci değerlendirirsiniz

çok açıkça iki öğe arasında tarafına ya işaret veya bütün bir kutu işaret ediyor.

Kutu ve işaretçi diyagramlarını yanlış mı yoksa tamamen başka bir şeyle mi anlıyorum?

cevap

5

Son varsayımınız doğru. Nokta, işaretçi değerinin nerede olduğunu gösterir, okun işaret ettiği çift kutunun tamamı hedeftir. Yan, üst orta, üst sol veya üst sağa işaret ediyorsa farketmez. Nesnenin "adresi" olan bütün çift.

Nesnenin bir kısmına, car ve cdr numaralı parçalara erişmeden bölümün bir bölümünü gösteremezsiniz. Yaptığın ikincisi, dolaylı bir işaretçi değil, işaret ettiği her şeye sahipsin. (car '(a b)) ; ==> a ve a'un, çöp toplanıncaya kadar işaret eden listenin hiçbir özü yoktur.

Biz artık şöyle bunu göstermek olabilir: Sonraki iki car ve cdr iken

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

= # ile ilk değer, kutunun kendisi konumudur. Yukarıda, x adres # 3 puan ve # 1 ila z1. Gördüğünüz gibi en z2

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

yapalım, z2 onun listesinin her iki eleman ile aynı nesneyi yeniden olmadığından z1 ikiden fazla cons kullanır, ancak bireysel benzer görünümlü listelerini kullanır.Çizimlerde, car ve cdrz110 her ikisi de aynı listede x numaralı listeye işaret etmektedir. z2 iki farklı listelerine puan, ama bu listelerde elemanları aynıdır.

Bunun nedeni sembolleri singletons olmasıdır. Böylece, sadece a için bir sembol nesnesi var ve iki farklı yerde 'a değerlendirerek olacak aynı a hem nokta. Diğer singletonların #f, #t ve ()

cons her zaman taze kana oluşturur ve list birlikte o cons argümanlar sadece bir prosedürdür. Böylece ifadede aynı kod (list 'a 'b) iki yerde sadece aynı bakmak iki farklı nesneleri yapar.

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

Belirtilen veriler, program başlamadan önce bir kerede oluşturulduğu gibi görülebilir. Böylece bu tanımlanmamıştır.

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

nedeni Şeması yapısı z1 ile olduğundan verileri aynı şekilde yeniden izin değil, zorunlu olmasıdır.

10

Çok fazla okuyorsunuz. Bu hücreyi oyuna getiremez için :-) kutunun yerde içine işaret ediyorsa, o varsayalım bir işaretçi bu. Sen Özellikle bunun car veya cdr kısmına işaret edemez.

+1

Neden özellikle bir çift bir araba ya cdr işaret edemez? Sadece kongre mi? – Aaron

+4

Şema (ve Lisp) C değildir; kendi başına adresleri yoktur. Bu, (kavramsal olarak) her zaman bir nesneye atıfta bulunduğu nesne referanslarına sahiptir. Bu yüzden, bir dezavantajları hücreye bir amacı, bir referans bütün dezavantajları hücre (genellikle olumsuz yönleri hücrenin başlangıç ​​konumu için bir işaretçi olarak uygulanan olsa bile), bir dizeye bir amacı, bir referans bütün dizisini belirtir belirtir (ve dizedeki tek tek karakterler), bir vektöre bir nesne referansı, tüm vektörü, vs. ifade eder. –