会递归直到堆栈溢出。
原因是 在 new-if 还没有展开为 cond special forms 时,else-clause 子式已经陷入了无限递归。 做了以下实验,可以验证
(define (new-if pred thenc elsec)
(cond (pred thenc)
(else elsec)))
(define (iter x y)
(new-if (= x y)
0
(iter (+ x 1) y)))
(define (iter-if x y)
(if (= x y)
0
(iter-if (+ x 1) y)))
(define (iter-cond x y)
(cond ((= x y) 0)
(else (iter-cond (+ x 1) y))))
对于 (iter 1 10), (iter-if 1 10), (iter-cond 1 10)
其中 iter 会 导致堆栈溢出,而 iter-cond 和 iter-if 并不会。
此题同1.5
在1.5中,由于应用序的原因,在 test 表达式 还没有展开为 if 特殊形式(special forms)时, (p)已经陷入了无限递归。