2011-04-25 59 views
1

为什么在下一个代码中,当我们在正常eval(懒惰的一个)上工作时什么也不显示。计划 - 打印到屏幕 - 正常eval

;;; [Number, Number -> Number] 
(define (printing-sub x y) 
    (display x) 
    (- x y)) 

;;; [Number, Number -> Number] 
(define (f a b) 
    (if (< a 0) 
a 
     (f b (printing-sub b a)))) 
(f 0 0) 

我exmplain:在第一次迭代中,我们将得到(f 0 (printing-sub 0 0)),在第二:(f (prining-sub 0 0) (prining sub (printing sub 0 0) 0).现在,在第三,我们要计算(printing-sub 0 0),因为我们想知道(if (<a 0)。在这个迭代中,0会打印出来。

我缺少什么?

谢谢。

+0

任何其他你所用“正常的eval(懒惰的)”的意思是?你是否在用'#懒惰“来使用球拍? – 2011-04-25 10:25:29

+0

@Eli Barzilay:我的意思是正常顺序:en.wikipedia.org/wiki/Evaluation_strategy#Normal_order – Tom 2011-04-26 20:10:46

+0

我知道“正常顺序”是什么意思,但目前还不清楚你要实际做什么。你是否正在使用一些懒惰的评估器的现有实现,或者你是否实现了自己的,或者你没有使用任何东西,只是猜测它应该做什么? – 2011-04-27 18:49:26

回答

0

我也不知道“normal eval”是什么意思,但我不明白你为什么会期望用0代码打印出来。事实上,它会导致无限循环,打印出无尽的零。

注意(printing-sub 0 0)将始终只显示0和返回0,因为(- 0 0)是0,所以在你(f 0 (printing-sub 0 0))第一次迭代这降低了回(f 0 0)这将导致无限循环。

换句话说,在if结果始终为#f因为a永远不会变得比0

+0

谢谢,但这不是正常评估中发生的情况(与正常顺序相同 - http://en.wikipedia.org/wiki/Evaluation_strategy#Normal_order)。 (打印子0 0)只会在第3次迭代中计算。我也认为我们将进入一个无限循环,打印出无尽的零。但我在官方的解决方案中看到,没有任何东西会打印到屏幕上。 – Tom 2011-04-26 20:06:46