2015-03-02 50 views
0

我認爲球拍的內部縮小總是用於評估,但我發現例如「如果」(和cond ?!)在球拍中是懶惰的評價...爲什麼這需要?球拍:內在減少還是懶惰評估?

是否無法通過內部還原實現if語句?

我不知道哪裏的懶惰評價比內在好,反之亦然?有人可以提供一個例子嗎?

+0

對於懶惰的評估,你有'#!lazy'這是一個[懶惰的球拍語言](http://docs.racket-lang.org/lazy/),非常類似於#!racket。由於'#!lazy'是懶惰的,所以'#!racket'中的'if'和其他特殊形式只是'#!lazy'中的普通過程。 – Sylwester 2015-03-02 21:49:37

回答

4

ifcond不是「懶」,他們只是有不同的評估規則。例如,在下面的表達式僅因之if的一部分被執行時,因爲條件恰好是true

(if (= 1 1) 
    'ok 
    (/ 1 0)) 
=> 'ok 

如果替代一部分被執行,我們就會有一個除以零誤差。這不是懶惰的評估,它只是if表達式在Scheme中的工作方式。因此錯誤 -

(define (my-if condition consequent alternative) 
    (if condition 
     consequent 
     alternative)) 

(my-if (= 1 1) 'ok (/ 1 0)) 
=> /: division by zero 

現在我們正在使用的程序,標準的評價規則,在非懶解釋指定執行程序的身體之前,所有的參數進行評估:與這一個比較上面的例子被提出。 這就是爲什麼if不能作爲一個正常的過程來實現,它必須是一個特殊的形式,因爲它需要不同的評估規則。

+2

還要注意'cond'不是特殊的,因爲它只是宏擴展爲'if'表達式。 – 2015-03-02 21:08:02