我定义了if
的新版本:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
然后我将它用作以下内容:
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
我理解,由于始终会对else-clause
过程中传递给new-if
的{{1}}进行评估,因此sqrt-iter
永远不会停止对自身进行递归调用。
但我不明白为什么在sqrt-iter
返回good-enough?
=>时我们不会停止true
答案 0 :(得分:5)
您的new-if
是一个程序。在传递给过程之前评估过程参数。因此,在调用sqrt-iter
之前,将完全评估您的递归new-if
调用。正如Robert Harvey评论的那样,这会产生无限的递归。
您的new-if
需要是一个正常运行的宏。类似的东西:
(define-syntax new-if
(syntax-rules ()
((_ predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))))