このセクションでは複雑な条件を表現するためにif
やcond
とともによく使用される構文を説明します。and
とor
の構文は、ある種の複数条件の構文として個別に使用することもできます。
この関数はconditionが偽であることをテストする。この関数はconditionがnil
ならt
、それ以外はnil
をリターンする。関数not
はnull
と等価であり、空のリストやnil
値をテストする場合は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
とは対照的に引数はどちらも常に評価されることに注意。