除问题What's the explanation for Exercise 1.6 in SICP?之外。 因此,Racket博士(R5RS)在有限时间内使用“if”评估sqrt-iter功能,清楚地显示正常的订单评估。但是如果我使用练习1.5中的例子
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
它进入无限循环,让我觉得“如果”使用应用程序订单评估。 那我错在哪里?
答案 0 :(得分:10)
发生的事情是if
永远不会到达:正是因为评估的适用顺序,test
的参数在实际调用test
之前得到了的评估,表达式(p)
将永远循环。
如果使用正常顺序评估相同的程序,它将返回零,这就是本示例首先尝试演示的内容。
答案 1 :(得分: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)的调用。