如果表达式在Scheme中有什么区别?

时间:2015-11-16 20:40:59

标签: 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)))

我理解,由于始终会对else-clause过程中传递给new-if的{​​{1}}进行评估,因此sqrt-iter永远不会停止对自身进行递归调用。

但我不明白为什么在sqrt-iter返回good-enough? =>时我们不会停止true

1 个答案:

答案 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)))))