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