SICP练习1.5和1.6

时间:2012-09-11 21:08:34

标签: scheme sicp racket r5rs

除问题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))

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

2 个答案:

答案 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)的调用。