會遞歸直到堆棧溢出。
原因是 在 new-if 還沒有展開為 cond special forms 時,else-clause 子式已經(jīng)陷入了無限遞歸。 做了以下實(shí)驗(yàn),可以驗(yàn)證
(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 會 導(dǎo)致堆棧溢出,而 iter-cond 和 iter-if 并不會。
此題同1.5
在1.5中,由于應(yīng)用序的原因,在 test 表達(dá)式 還沒有展開為 if 特殊形式(special forms)時, (p)已經(jīng)陷入了無限遞歸。