SICP Упражнение 1.5

Упражнение 1.5. Бен Битдиддл изобрел тест, чтобы определить, использует ли интерпретатор, с которым он сталкивается, оценку аппликативного порядка или оценку нормального порядка. Он определяет следующие две процедуры:

(определить (р) (р))

(определить (проверить x y) (если (= x 0) 0 y))

Затем он вычисляет выражение

(тест 0 (р))

Какое поведение будет наблюдать Бен с интерпретатором, использующим оценку аппликативного порядка? Какое поведение он увидит с интерпретатором, использующим оценку нормального порядка?

Я понимаю ответ на упражнение; мой вопрос заключается в том, как интерпретируется (p) по сравнению с p. Например, (test 0 (p)) вызывает зависание интерпретатора (что и ожидалось), но (test 0 p) с приведенным выше определением немедленно оценивается как 0. Почему?

Кроме того, предположим, что мы изменили определение на (define (p) p). При данном определении и (тест 0 (p)) и (тест 0 p) оцениваются как 0. Почему это происходит? Почему не зависает интерпретатор? Я использую Dr. Racket с пакетом SICP.


person JellalF    schedule 04.07.2012    source источник


Ответы (1)


p — это функция. (p) — это вызов функции.

В вашем интерпретаторе оцените p.

p <Return>
==>  P : #function

Теперь оцените (p). Убедитесь, что вы знаете, как убить своего переводчика! (Вероятно, в Dr. Racket есть кнопка «Стоп».)

(p)

Обратите внимание, что ничего не происходит. Или, по крайней мере, ничего не видно. Интерпретатор уходит, устраняя хвостовые вызовы (таким образом, используя около 0 памяти), вызывая p.

Поскольку p и (p) оценивают разные вещи, вы должны ожидать разного поведения.

Что касается вашего второго вопроса: вы определяете p как функцию, которая возвращает себя. Снова попробуйте оценить p и (p) с помощью (define (p) p) и посмотрите, что получится. Я предполагаю (я использую компьютер, на который я не могу ничего установить и на котором нет схемы) состоит в том, что они будут оценивать одно и то же. (Могу даже поспорить, что (eq? p (p)) будет оцениваться как #t.)

person Charles Moss    schedule 04.07.2012
comment
Спасибо. тоже ищу ответ. - person user1166240; 14.10.2017