2015-07-30 3 views
7

Структурные и интерпретационные диаграммы и схемы интерпретации компьютерных программ (SICP) на рисунках 3.16 и 3.17 не выглядят эквивалентными (чисто по отношению к значению, а не к памяти) даже хотя это и говорит. ("Когда рассматривать как список, z1 и z2 оба представляют собой "тот же самый" список, ((a b) a b))", стр 258.)Несогласованные диаграммы-указатели в SICP

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

SICP диаграммы пару z1, как это:

enter image description here

и z2 так:

enter image description here

стрелки в ра ir, z1, оба, кажется, не указывают на всю пару, x. Они даже не указывают на одно и то же, несмотря на то, что получили одинаковые (память и стоимость) пару. Я хотел бы оценить первую диаграмму как (a b), а второй в качестве ((a b) a b)

Я мог бы предположить, что каждая стрелка фактически указует на все пары, x, но на рисунке 2.3 на странице 98:

enter image description here

он очень четко указывает на всю коробку, либо указывая на сторону, либо между двумя предметами.

Я понимаю неправильные диаграммы и указатели или что-то еще?

ответ

5

Ваше последнее предположение верно. Точка указывает, где значение указателя, весь двойной квадрат, на который указывает стрелка, является целью. Не имеет значения, указывает ли он на сторону, верхнюю середину, верхнюю левую или верхнюю правую. Это целая пара, которая является «адресом» объекта.

Вы не можете указывать на часть объекта, не обращаясь к ее части с помощью car и cdr. Второе, что вы делаете, у вас есть все, на что он был направлен, а не косвенный указатель. (car '(a b)) ; ==> a и a не имеет сущности списка, который все еще указывает на него, пока не будет собран мусор.

Мы могли бы проиллюстрировать, как это вместо:

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

Первое значение с = # это расположение самой коробки, в то время как рядом два являются car и cdr. Выше, x указывает на адрес № 3 и z1 на # 1. Давайте сделаем z2

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

Как вы можете видеть, z2 использует более двух cons чем z1, так как он не использует повторно тот же объект, как элементы списка, но использует отдельные подобные выглядящие списки.

На чертежах как car, так и cdr от z1 указать на тот же список x. z2 указывает на два разных списка, но элементы в этих списках одинаковы.

Причина в том, что символы являются одиночными. Таким образом, у вас есть только один объект-символ для a, и оценка 'a в двух разных местах будет указывать на то же самое a. Другие одиночки являются #f, #t и ()

cons всегда создает свежую пару и list просто процедура, которая cons вместе аргументы. Таким образом, один и тот же код (list 'a 'b) два места в выражении создают два разных объекта, которые выглядят одинаково.

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

Данные, указанные в котировках, можно просмотреть, как созданные все сразу перед запуском программы. Таким образом, это не определено.

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

Причина заключается в том, что схема имеет право, но не обязана, повторное использование данных таким же образом, как со структурой z1.

10

Вы слишком много читаете в нем. :-) Если он указывает на поле в любом месте, предположим, что это указатель на эту ячейку cons. Вы не можете конкретно указывать на часть car или cdr.

+1

Почему вы не можете указать на автомобиль или cdr пары конкретно? Просто конвенция? – Aaron

+4

Схема (и Lisp) не является C; он не имеет адресов как таковых. Он имеет объектные ссылки, которые (концептуально) всегда относятся к целому объекту, а не к его частям. Таким образом, ссылка объекта на ячейку cons ссылается на целую ячейку cons (даже если она обычно реализуется как указатель на местоположение начала ячейки cons), ссылка объекта на строку ссылается на всю строку (и не отдельные символы в строке), ссылка объекта на вектор относится ко всему вектору и т. д. –

Смежные вопросы