除了问题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))
它进入无限循环,让我觉得“如果”使用了应用顺序评估。那么我错在哪里?
除了问题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))
它进入无限循环,让我觉得“如果”使用了应用顺序评估。那么我错在哪里?
发生的情况if
是永远不会达到:正是由于计算的应用顺序,两个参数都在实际调用之前test
被计算,并且表达式将永远循环。test
(p)
如果使用正常顺序评估相同的过程,它将返回零,这就是本示例首先要演示的内容。
在第一行使用带有#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) 的调用。