2011-11-05 3 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)。 が存在しない場合は#fが返され、それ以外の場合はの式が左から右に評価され、が真の値val(5.7節を参照)を返すか、最後のに到達します。または式は残りの式を評価せずにvalを返します。後者の場合は、最後の式が評価され、その値が返されます。ジョーの「または」機能はこのように機能しますか? –

+2

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

+1

ちなみに、それはプログラマによって定義できますが、単純な関数としては定義できません。それは特定の特別な値のために特別ではありません。 http://www.scheme.com/tspl4/further.html#defn:or – erjiang

答えて

13

orのこのバージョンは(関数なので)すべての引数を評価し、標準スキームor(関数ではないが特殊な構文)は評価しないためです。 Scheme REPLで(or #t (exit))を実行してから、or関数で同じことを試してみてください。

標準orの動作は、時にはshort-circuitedと呼ばれ、必要な引数だけを評価します。これはプログラミング言語にわたるバイナリブール演算子(orおよびand)で非常に一般的です。 orのように見えますが、関数呼び出しはScheme/Lisp構文の機能ですが、うんざりしています。

+0

それだけです!あなたの説明をありがとう、それは多くの助けになりました! – Edgar

1

動作するかどうかは、実行するかどうかによって異なります。これは確かに、与えられた2つのブール値に対して期待される結果を返すという意味で機能します。しかし、正常にorを使用しているときに0で0を除算するため、にはエラーが発生し、#tが返され、(/ 0 0)を評価しようとしないため、短絡しないため、機能的には通常のorと同等ではありません。まったく。

+0

それは、ありがとう! – Edgar

関連する問題