2011-04-25 99 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