2011-11-05 79 views
6

我發現關於特殊功能「或」計劃這樣一個問題:爲什麼我不能在方案中定義「或函數」?

喬黑客大聲指出,沒有任何理由或方式要特別 - 它可以只由程序員定義,像這樣:

(define (or x y) 
    (if x 
     #t 
     y)) 

是喬對嗎?

我不明白爲什麼它不應該做到這一點。

有些計劃專家請解釋一下,如果這個工作,如果沒有:爲什麼不?

+1

我不知道你用什麼書來學習Scheme,所以我不得不去[Scheme語言規範](http://www.r6rs.org/final/html/r6rs/r6rs-ZH -14.html#node_sec_11.4.5)。 「如果沒有 s,則返回#f;否則,從左到右評估表達式,直到返回真值val(請參閱第5.7節)或者最後一個達到。或者表達式返回val而不計算剩餘的表達式,在後一種情況下,計算最後一個表達式並返回其值。「 Joe的「或」功能是以這種方式工作的嗎? –

+2

http://www.cs.washington.edu/education/courses/cse341/99wi/scheme/mini-exercises.html –

+1

順便說一下,它*可以*由程序員定義,但不是一個簡單的函數。這對特定的某些值不是特別的。 http://www.scheme.com/tspl4/further.html#defn:或 – erjiang

回答

13

這是因爲這個版本的or評估它的所有參數(因爲它是一個函數),而標準的Scheme or(它不是一個函數,但是特殊的語法)沒有。嘗試在Scheme REPL上運行(or #t (exit)),然後嘗試使用or函數。

標準or的行爲有時被稱爲short-circuited:它只評估它需要的那些參數。這對跨編程語言的二進制布爾運算符(orand)非常常見。 or看起來像這個事實,函數調用是Scheme/Lisp語法的一個特性,但看起來很迷惑。

+0

就是這樣!謝謝你的解釋,這對你有很大幫助! – Edgar

1

它是否有效取決於你想要它做什麼。它肯定適用於兩個給定的布爾值,它將返回預期的結果。然而,它不會在功能上等同於正常的or,因爲它不會短路,即給定您的定義(or #t (/ 0 0))將導致錯誤,因爲您在使用常規or時將0除以0,它只會返回#t而不會嘗試評估(/ 0 0)在所有。

+0

就是這樣,謝謝! – Edgar

相關問題