我定义了一个新版本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-if在sqrt-iter过程始终评估,sqrt-iter从未停止使自身的递归调用.
但我不明白为什么我们在good-enough?return 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)))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |