Next: Iteration, Previous: Conditionals, Up: Control Structures [Contents][Index]
このセクションは、複雑な条件を表現するために、if
やcond
とともによく使用される3つの構成を記述します。and
とor
の構成は、ある種の複数条件の構成として、個別に使用することもできます。
この関数は、conditionが偽であることをテストします。この関数はconditionがnil
の場合はt
、それ以外はnil
をreturnします。関数not
はnull
と等価で、わたしたちは空のリストをテストする場合は、null
の使用を推奨します。
スペシャルフォームand
は、すべてのconditionsが真かどうかをテストします。この関数は、conditionsを記述された順に1つずつ評価することにより機能します。
あるconditionsがnil
に評価された場合、残りのconditionsに関係なく、and
はnil
を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)
は実行されないので、エラーにならないことに注意してください。
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
は即座にreturnし、残りのconditionsは無視されます。この関数がreturnする値は、非nil
値に評価された条件の値そのものです。
すべてのconditionsがnil
になった場合、or
式はnil
をreturnします。conditionsのない単独の(or)
は、nil
をreturnします。なぜなら、すべてのconditionsがnil
になるので(考えてみてください。そうでないのはどれですか?)、これは適切です。
たとえば、この式は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回以上引数を評価することは、決してありません。