I'm just beginning to work through SICP (on my own; this isn't for a class), and I've been struggling with Exercise 1.6 for a couple of days and I just can't seem to figure it out. This is the one where Alyssa re-defines if
in terms of cond
, like so:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause))
She tests it successfully on some simple cases, and then uses it to re-write the square root program (which worked just fine with if
):
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
The question then asks: "What happens when Alyssa attempts to use this to compute square roots? Explain." [If necessary, I'm happy to reproduce the other procedures (good-enough?
, improve
, etc.), just let me know.]
Now, I know what happens: it never returns a value, which means that the program recurses infinitely. I just can't explain why this happens. Whatever subtle difference exists between if
and new-if
is eluding me. Any and all help much appreciated.
new-if
is a function. When a function is called, what's the first thing that Scheme does with the argument list? It evaluates all the arguments.