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

Ana*_*oly 0 scheme

我定义了一个新版本if:

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
    (else else-clause)))
Run Code Online (Sandbox Code Playgroud)

然后我用它如下:

(define (sqrt-iter guess x)
  (new-if (good-enough? guess x)
  guess
  (sqrt-iter (improve guess x)
             x)))
Run Code Online (Sandbox Code Playgroud)

据我所知,由于else-clause传递给new-ifsqrt-iter过程始终评估,sqrt-iter从未停止使自身的递归调用.

但我不明白为什么我们在good-enough?return true=> 时不停止guess

Chr*_*ung 5

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)))))
Run Code Online (Sandbox Code Playgroud)