我在閱讀關於懶惰評估和無法理解他們給出的基本示例。爲什麼不這個球拍代碼終止?
#lang racket
(define (bad-if x y z)
(if x y z))
(define (factorial-wrong x)
(bad-if (= x 0)
1
(* x (factorial-wrong (- x 1)))))
(factorial-wrong 4)
我有點困惑,爲什麼這個程序永遠不會終止。我知道下面的代碼工作得很好:
(define (factorial x)
(if (= x 0)
1
(* x (factorial (- x 1)))))
(factorial 4)
所以我假設它與範圍有關。我試圖一步一步調試和階乘-錯誤執行,即使當x映射到0。
所以'if'語句在兩個例子中的行爲是不同的?任何想法爲什麼這樣? – jeebface 2014-10-21 21:46:25
否if語句的行爲完全相同。不同之處在於你稱之爲壞的事實 - 如果這是一個過程。這是強制進行額外評估的程序調用機制。 – uselpa 2014-10-21 21:54:43
爲了進一步說明'if'不是一個過程,如果你在REPL中輸入'bad-if',你應該看到類似'#',而如果你輸入'if ',你應該得到一個'bad-syntax'錯誤。 「或」和「和」也是如此,因爲這兩種形式對於何時評估他們的論點也有特殊的規則。 –
Jack
2014-10-21 22:20:49