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回以上引数を評価することは、決してありません。