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
之前,它尝试计算它的所有参数,其中一个是递归调用。因此是无限循环。