Next: , Previous: , Up: Control Structures   [Contents][Index]


10.3 Constructs for Combining Conditions

このセクションは、複雑な条件を表現するために、ifcondとともによく使用される3つの構成を記述します。andorの構成は、ある種の複数条件の構成として、個別に使用することもできます。

Function: not condition

この関数は、conditionが偽であることをテストします。この関数はconditionnilの場合はt、それ以外はnilをreturnします。関数notnullと等価で、わたしたちは空のリストをテストする場合は、nullの使用を推奨します。

Special Form: and conditions…

スペシャルフォームandは、すべてのconditionsが真かどうかをテストします。この関数は、conditionsを記述された順に1つずつ評価することにより機能します。

あるconditionsnilに評価された場合、残りのconditionsに関係なく、andnilをreturnしなければなりません。この場合、andは即座にnilをreturnし、残りのconditionsは無視されます。

すべてのconditionsが非nilの場合、それらの最後の値がandフォームの値になります。conditionsのない単独の(and)は、tをreturnします。なぜなら、すべてのconditionsが非nilとなるので(考えてみてください。そうでないのはどれですか?)、これは適切です。

以下に例を示します。1番目の条件は整数1をretuenし、これはnilではありません。同様に2番目の条件は整数2をreturnし、これもnilではありません。3番目の条件はnilなので、のこりの条件が評価されることは決してありません。

(and (print 1) (print 2) nil (print 3))
     -| 1
     -| 2
⇒ nil

以下は、andを使用した、より現実的な例です:

(if (and (consp foo) (eq (car foo) 'x))
    (message "foo is a list starting with x"))

(consp foo)nilをreturnした場合、(car foo)は実行されないので、エラーにならないことに注意してください。

ifcondのどちらかを使用して、and式を記述することもできます。以下はその方法です:

(and arg1 arg2 arg3)
≡
(if arg1 (if arg2 arg3))
≡
(cond (arg1 (cond (arg2 arg3))))
Special Form: or conditions…

スペシャルフォームorは、少なくとも1つのconditionsが真かどうかをテストします。この関数は、すべてのconditionsを1つずつ、記述された順に評価することにより機能します。

あるconditionsが非nil値に評価された場合、orの結果は非nilでなければなりません。この場合、orは即座にreturnし、残りのconditionsは無視されます。この関数がreturnする値は、非nil値に評価された条件の値そのものです。

すべてのconditionsnilになった場合、or式はnilをreturnします。conditionsのない単独の(or)は、nilをreturnします。なぜなら、すべてのconditionsnilになるので(考えてみてください。そうでないのはどれですか?)、これは適切です。

たとえば、この式はxnilまたは整数0かどうかをテストします:

(or (eq x nil) (eq x 0))

and構成と同様に、orcondに置き換えて記述することができます。たとえば:

(or arg1 arg2 arg3)
≡
(cond (arg1)
      (arg2)
      (arg3))

ほとんどの場合、orifに置き換えて記述できますが、完全ではありません:

(if arg1 arg1
  (if arg2 arg2
    arg3))

これは完全に同一ではありません。なぜならarg1またはarg2を2回評価するかもしれないからです。対照的に、(or arg1 arg2 arg3)は2回以上引数を評価することは、決してありません。