Упражнение 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.