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

Scheme中的两个if表达式有什么区别?,scheme,Scheme,如果,我将定义新版本的: (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

如果,我将定义新版本的

(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子句始终是经过计算的,
sqrt iter
从不停止对自身进行递归调用


但是我不明白为什么当
足够好时我们不停下来?
返回
true
=>
猜测

如果
是一个过程,那么您的
是新的。过程参数在传递给过程之前进行求值。因此,在调用
new if
之前,将对递归
sqrt iter
调用进行全面评估。正如Robert Harvey所评论的,这会导致无限递归

您的
新if
需要是宏才能正常工作。比如:

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

如果
是一个过程,则您的
是新的。过程参数在传递给过程之前进行求值。因此,在调用
new if
之前,将对递归
sqrt iter
调用进行全面评估。正如Robert Harvey所评论的,这会导致无限递归

您的
新if
需要是宏才能正常工作。比如:

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

因为
sqrt iter
从不停止对自身进行递归调用?但是当我们评估
足够好时?
返回
true
为什么我们不停止?在Scheme
中,if
是一种特殊形式,这意味着它不会评估它的所有参数。正常形式在执行过程之前评估所有参数。其他特殊形式有
定义
条件
。在解释器调用
newif
之前,它尝试计算它的所有参数,其中一个是递归调用。因此是无限循环。因为
sqrt iter
从不停止对自身进行递归调用?但当我们评估
足够好时?
返回
true
为什么我们不停止?在Scheme中
if
是一种特殊形式,这意味着它不会评估它的所有参数。正常形式在执行过程之前评估所有参数。其他特殊形式有
定义
条件
。在解释器调用
newif
之前,它尝试计算它的所有参数,其中一个是递归调用。因此是无限循环。