我認爲球拍的內部縮小總是用於評估,但我發現例如「如果」(和cond ?!)在球拍中是懶惰的評價...爲什麼這需要?球拍:內在減少還是懶惰評估?
是否無法通過內部還原實現if語句?
我不知道哪裏的懶惰評價比內在好,反之亦然?有人可以提供一個例子嗎?
我認爲球拍的內部縮小總是用於評估,但我發現例如「如果」(和cond ?!)在球拍中是懶惰的評價...爲什麼這需要?球拍:內在減少還是懶惰評估?
是否無法通過內部還原實現if語句?
我不知道哪裏的懶惰評價比內在好,反之亦然?有人可以提供一個例子嗎?
if
和cond
不是「懶」,他們只是有不同的評估規則。例如,在下面的表達式僅因之的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
不能作爲一個正常的過程來實現,它必須是一個特殊的形式,因爲它需要不同的評估規則。
還要注意'cond'不是特殊的,因爲它只是宏擴展爲'if'表達式。 – 2015-03-02 21:08:02
對於懶惰的評估,你有'#!lazy'這是一個[懶惰的球拍語言](http://docs.racket-lang.org/lazy/),非常類似於#!racket。由於'#!lazy'是懶惰的,所以'#!racket'中的'if'和其他特殊形式只是'#!lazy'中的普通過程。 – Sylwester 2015-03-02 21:49:37