Особая форма
Лиза П. Хакер не понимает, почему if должна быть особой формой.«Почему нельзя просто определить ее как обычную процедуру с помощью cond?» — спрашивает она. Лизина подруга Ева Лу Атор утверждает, что, разумеется, можно, и определяет новую версию if:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
Ева показывает Лизе новую программу:
(new-if (= 2 3) 0 5)
5
(new-if (= 1 1) 0 5)
0
Обрадованная Лиза переписывает через new-if программу вычисления квадратного корня:
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
Что получится, когда Лиза попытается использовать эту процедуру для вычисления квадратных корней? Объясните.
The book doesn't prepare us for this question. Readers will likely think the issue is a difference between
if
andcond
; it's not. The issue is that wrappingcond
in a function changes how arguments are evaluated. When a function is evaluated, its arguments are evaluated right away. But it's impossible to evaluate the arguments tonew-if
, becausesqr-iter
simply calls itself repeatedly. See https://stackoverflow.com/questions/1171252/whats-the-explanation-for-exercise-1-6-in-sicp