2016-10-15 7 views
2

私はRacketとDr. Racketを教育目的で使用しています。次の変数の定義は、「X」と「Y」の後リストを受け取った後に「と」と「か」の結果が得られるのはなぜですか?

は:

(define x (list 1 2 3)) 
(define y (list 4 5 6)) 

私はこれらの変数を使用した3種類のリストを作成することを決めました。

まず:

(append x y) 

>> '(1 2 3 4 5 6) 

第二:

(cons x y) 

>> '((1 2 3) 4 5 6) 

サード:その後

(list x y) 

>> ((1 2 3) (4 5 6)) 

、私はブール演算子を使用することを決めた "と" と "または" と3つのリスト。私が驚いたのはアウトプットでした。なぜこれが起こるのですか?なぜ "か"と "と"と "リストの1つを選ぶ?この決定の背後にある比率は何ですか?

(and (append x y) (cons x y) (list x y)) 

>> '((1 2 3) (4 5 6)) 

(or (append x y) (cons x y) (list x y)) 

>> '(1 2 3 4 5 6) 

答えて

5

それは簡単です:orがtruthyある最初式の値を返すのに対し、少なくとも一つの式が偽の場合truthyまたは#fある最後式の値を返しますand#fがすべてfalseの場合。

覚えておいてください:Schemeでは唯一の偽値は#fですが、他のものは真と見なされるため、モニカ "truthy"を使用して、偽でない値を示します。この、特にあなたのコード内では:この一方で、(list x y)

(and (append x y) (cons x y) (list x y)) 

最後truthy式の値を返します(append x y)

(or (append x y) (cons x y) (list x y)) 

最初truthy式の値を返します。

+0

これは他のほとんどの言語のケースであり、便利なイディオムで使用できます。たとえば、ゼロ除算を防止する数値で除算するには、(and(not x = 0))(/ 1 x))と書くことができます。xがゼロでない場合は1/xを返し、そうでない場合はnilを返します。 – Leo

+0

式を返すのではなく、値を返します。 –

4

andorもあなたがandと特別な制御フロー演算子のorを考えることができ、フローオペレータに

を制御しています。それらは機能しません。関数andは、引数を評価してから、,またはfalseを返します。この場合andor

は、機能ではなく、いくつかの状況下ではなく、すべての引数が評価されます。

  • orはすぐにそれを見たとき、それは
  • andはすぐに戻ります値を見たときに返します

戻り値

両方ものがある場合にも、値を返す:

  • or戻り最初
  • and戻り最後値、場合すべての引数はtrueです。

以降は単一のブール値を意味するだけでなく、他のほとんどのオブジェクトも,であることを意味します。 #fのみがではありません。です。

他の条件付き制御フロー演算子

例は次のようになります

  • 場合
  • COND場合
  • 場合
0123ない限り
関連する問題