Next: Pattern-Matching Conditional, Previous: Conditionals, Up: Control Structures [Contents][Index]
このセクションでは複雑な条件を表現するためにifやcondとともによく使用される構文を説明します。andとorの構文は、ある種の複数条件の構文として個別に使用することもできます。
この関数はconditionが偽であることをテストする。この関数はconditionがnilならt、それ以外はnilをリターンする。関数notはnullと等価であり、空のリストをテストする場合はnullの使用を推奨する。
スペシャルフォームandは、すべてのconditionsが真かどうかをテストする。この関数はconditionsを記述順に1つずつ評価することにより機能する。
あるconditionsがnilに評価されると、残りのconditionsに関係なく、andはnilをリターンしなければならない。この場合andは即座にnilをリターンして、残りのconditionsは無視される。
すべてのconditionsが非nilなら、それらの最後の値がandフォームの値になる。conditionsがない単独の(and)はtをリターンする。なぜならすべてのconditionsが非nilとなるので、これは適切である(考えてみてみよ、非nilでないconditionsはどれか?)。
以下に例を示す。1番目の条件は整数1をリターンし、これはnilではまい。同様に2番目の条件は整数2をリターンし、これも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をリターンすると、(car
foo)は実行されないのでエラーにならないことに注意。
ifかcondのいずれかを使用して、and式を記述することもできる。以下にその方法を示す:
(and arg1 arg2 arg3) ≡ (if arg1 (if arg2 arg3)) ≡ (cond (arg1 (cond (arg2 arg3))))
スペシャルフォームorは、少なくとも1つのconditionsが真かどうかをテストする。この関数はすべてのconditionsを1つずつ、記述された順に評価することにより機能する。
あるconditionsが非nil値に評価されたら、orの結果は非nilでなければならない。この場合orは即座にリターンし、残りのconditionsは無視される。この関数がリターンする値は、非nil値に評価された条件の値そのものである。
すべてのconditionsがnilなら、or式はnilをリターンします。conditionsのない単独の(or)はnilをリターンする。なぜならすべてのconditionsがnilになるのでこれは適切である(考えてみよ、nilでないconditionsはどれか?)。
たとえば以下の式は、xがnilか整数0かどうかをテストする:
(or (eq x nil) (eq x 0))
and構文と同様に、orをcondに置き換えて記述することができる。たとえば:
(or arg1 arg2 arg3)
≡
(cond (arg1)
(arg2)
(arg3))
ほとんどの場合は、orをifに置き換えて記述できるが完全ではない:
(if arg1 arg1
(if arg2 arg2
arg3))
これは完全に同一ではない。なぜならarg1かarg2を2回評価するかもしれないからである。対照的に(or
arg1 arg2 arg3)が2回以上引数を評価することは決してない。
この関数はcondition1とcondition2の排他的論理和をリターンする。つまりxorは引数がいずれもnilあるいは非nilならnilをリターンする。それ以外なら非nilの引数の値をリターンする。
orとは対照的に引数はどちらも常に評価されることに注意。