Alyssa P. Hacker doesn't see why
if
needs to be provided as a special form. "Why can't I just define it as an ordinary procedure in terms of cond
?" she asks. Alyssa's friend Eva Lu Ator claims this can indeed be done, and she defines a new version of if
:(define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause)))
Eva demonstrates the program for Alyssa:
(new-if (= 2 3) 0 5) 5
(new-if (= 1 1) 0 5) 0
Delighted, Alyssa uses new-if to rewrite the square-root program:
(define (sqrt-iter guess x) (new-if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))
What happens when Alyssa attempts to use this to compute square roots? Explain.
In order to evaluate
sqrt-iter
the interpreter must evaluate new-if
. Now as Scheme uses applicative-order evaluation (for non-special forms), prior to evaluating new-if
the interpreter will attempt to evaluate all three of the predicate
, then-clause
and else-clause
operands. Note that this means that an attempt will be made to evaluate both the then-clause
and else-clause
operands, regardless of what the predicate
evaluates to.When the interpreter tries to evaluate the
else-clause
an infinite recursion occurs. This happens as evaluating the else-clause
operand requires evaluation of a further sqrt-iterator
expression which, of course, requires a further evaluation the else-clause
operand, and so on.
No comments:
Post a Comment