Scheme 中的两个 if 表达式有什么区别?

What the difference between two if expression in Scheme?

我定义了一个新版本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)))

我明白,由于在 sqrt-iter 过程中传递给 new-ifelse-clause 总是被求值,sqrt-iter 永远不会停止对自身进行递归调用。

但我不明白为什么我们在 good-enough? returns true => guess

时不停止

你的new-if是一个程序。过程参数在传递给过程之前进行评估。因此,您的递归 sqrt-iter 调用将在调用 new-if 之前进行全面评估。正如罗伯特哈维评论的那样,这导致无限递归。

您的 new-if 需要是一个宏才能正常运行。类似于:

(define-syntax new-if
  (syntax-rules ()
    ((_ predicate then-clause else-clause)
     (cond (predicate then-clause)
           (else else-clause)))))