6

除了问题SICP中练习1.6的解释是什么?. 所以 Racket 博士 (R5RS) 在有限时间内用“if”评估 sqrt-iter 函数,清楚地显示了正常的顺序评估。但是如果我使用练习 1.5 中的示例

(define (p) (p))
(define (test x y)
  (if (= x 0)
      0
      y))
(test 0 (p))

它进入无限循环,让我觉得“如果”使用了应用顺序评估。那么我错在哪里?

4

2 回答 2

10

发生的情况if是永远不会达到:正是由于计算的应用顺序,两个参数都在实际调用之前test被计算,并且表达式将永远循环。test(p)

如果使用正常顺序评估相同的过程,它将返回零,这就是本示例首先要演示的内容。

于 2012-09-11T21:43:58.743 回答
3

在第一行使用带有#lang 方案指令的 DrRacket,我尝试过这种方式......

;say "hi" to Ben Bitdiddle

(define (q) (display "Hello?...Ben?)

(define (test x y)
(if (= x 0) 
    0
    y))

然后我使用 DrRacket 5.3 调试工具逐步完成评估。
这显然是应用顺序评估。

评估窗口显示 -> 你好?……本?后跟一个 0 cuz DrRacket 在输入“if”之前评估对 (q) 的调用。

于 2012-10-20T22:19:48.897 回答