Next: Iteration, Previous: Conditionals, Up: Control Structures
本節では、if
やcond
とともに用いて複雑な条件を表現するために
しばしば使われる3つの構造を説明します。
and
やor
の構造は、
複数の条件付き構造の一種として単独で使うこともできます。
この関数は、conditionが偽であるかどうか調べる。 conditionが
nil
であればt
を返し、 さもなければnil
を返す。 関数not
はnull
と同一であるが、 空リストかどうか調べる場合には、null
を使うことを勧める。
スペシャルフォーム
and
は、 すべてのconditionsが真であるかどうか調べる。 conditionsを1つ1つ書かれた順に評価して調べる。conditionsのどれかが
nil
に評価されると、and
の結果は、残りのconditionsに関係なく、nil
になる。 つまり、and
はただちに完了し、 conditionsの残りを無視する。conditionsすべてが
nil
以外であることがわかると、 それらの最後の値がフォームand
の値となる。例を示そう。 最初の条件は整数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)
は実行されず、 そのためエラーを回避することに注意。
and
は、if
やcond
で表現できる。 たとえば、つぎのとおり。(and arg1 arg2 arg3) == (if arg1 (if arg2 arg3)) == (cond (arg1 (cond (arg2 arg3))))
スペシャルフォーム
or
は、 conditionsの少なくとも1つが真であるかどうか調べる。 conditionsを1つ1つ書かれた順に評価して調べる。conditionsのどれかが
nil
以外に評価されると、or
の結果はnil
以外になる。 そして、or
はただちに完了し、 conditionsの残りを無視する。 戻り値は、nil
以外に評価された値である。conditionsすべてが
nil
であることがわかると、or
はnil
を返す。たとえば、つぎの式は、
x
が0かnil
であることを調べる。(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)
は、 どの引数も一度だけ評価する。