次へ 前へ 目次へ 佐々木将人の個人ページへ

7 Lispにおける選択・条件分岐

if

 (if (= x 1) 1 2)
 もしxが1であれば1を,そうでなければ2を返します。
 一般化して書くとこうなります。
 (if (条件) (条件成立の場合の処理) (条件不成立の場合の処理))
 そしてLispでは「偽以外は全て真」として取り扱う約束でした。そこでこの一般化は
 (if (条件) (条件が偽以外である場合の処理) (条件が偽である場合の処理))
ということになります。
 なお,(条件が偽以外である場合の処理)や(条件が偽である場合の処理)の中に,さらにifの構文を入れるifの2段重ね,3段重ねなども可能です。

cond

 (cond ((= x 1) 'neko)
((= x 2) 'inu)
(t 'penguin))
 もしxが1であれば「neko」を,2であれば「inu」を,そうでなければ「penguin」を返します。
 一般化して書くとこうなります。
 (cond (条件1 条件1が成立した場合に実行する処理1 …… 条件1が成立した場合に実行する処理m)
(条件2 条件2が成立した場合に実行する処理1 …… 条件2が成立した場合に実行する処理n)
……
(条件p 条件pが成立した場合に実行する処理1 …… 条件oが成立した場合に実行する処理o))
 各条件について上から順にテストし,偽でなければその直後の処理を順次行い,最後の処理の値を返して終了します。この場合,その下にある条件についてはテストしません。
 仮に全ての条件についてテストして偽であれば,cond関数自体はnilを返して終了します。
 なお,条件のどれかには必ず成立してほしい(偽ではないとしてほしい)とか,cond関数にnilを返されては困るという場合には,条件のところに常に偽ではないとされる「t」と書いて,その場合の処理を書くのが定石となっています。
 if と cond は相互に書換が可能です。

and

 (and (= x 1) (= y 2))
 この例ではx=1,y=2がともに成立する場合にだけ,(= y 2) の値である真を返します。どちらかが不成立だと偽を返します。
 一般的には次の形式になります。
 (and 条件1 条件2 …… 条件N)
 各条件は左から右に順に評価していきます。最後まで評価して全部「偽ではない」となると条件Nの値を返します。
 途中で偽の値になるものがあると,そこから右の条件は評価せず「偽」を返します。
 and関数はifやcondの条件として使うこともできますし,「左から右に各条件を評価していき,偽があれば偽を返して終了,偽がなければ偽ではないと返して終了」なわけですから,ifやcondとは関係なしに使うこともできます。
 「偽でなければ全て真」として扱われることからすれば,上の一般的な例で「条件」と書きましたが,条件である必要は実はないことになります。
 逆にandがなくともifもしくはcondで書くことも可能です。

or

 各条件は左から右に順に評価していきます。orなので,偽ではない時点でその値を返し,もし全部偽であれば偽を返します。
 (or (= x 1) (= y 2))
 この例では,まず (= x 1) を評価し,偽ではないとなればその値を返し,残りの条件は評価しません。
 もし偽なら次の (= y 2) を評価します。偽ではないとなればその値を返し,偽であればもう他の条件はないので偽を返して終わりです。
 一般的には次の形式になります。
 (or 条件1 条件2 …… 条件N)
 or関数もifやcondの条件として使うこともできますし,「左から右に各条件を評価していき,偽でなければその値を返して終了,最後まで偽であれば偽と返して終了」なわけですから,ifやcondとは関係なしに使うこともできます。
 上の一般的な例で「条件」と書きましたが,条件である必要は実はないこともandと同じです。
 そしてorがなくともifもしくはcondで書くことも可能なのはandと同じです。

when

 (when (= x 1) 'neko 'inu 'saru)
 x=1の時だけ,'neko 'inu 'saruを順に実行し,最後の 'saru をwhenの値として返します。x=1ではない時は偽を返します。
 一般的には次の形式になります。
 (when 条件 条件が成立した場合に実行する処理1 …… 条件が成立した場合に実行する処理m)
 条件が真の時だけ(=偽ではない時だけ)後ろの各処理を順に実行し,最後の処理を値として返します。条件が偽の時は各処理は実行せずに偽を返します。

unless

 (unless (= x 1) 'neko 'inu 'saru)
 x=1ではない時だけ,'neko 'inu 'saruを順に実行し,最後の 'saru をunlessの値として返します。x=1の時は偽を返します。
 一般的には次の形式になります。
 (unless 条件 条件が不成立の場合に実行する処理1 …… 条件が不成立の場合に実行する処理m)
 条件が偽の時だけ後ろの各処理を順に実行し,最後の処理を値として返します。条件が偽ではない時は各処理は実行せずに偽を返します。

 ちなみに (unless (not 条件) ……) と (when 条件 ……) とは同じ意味ですし,
 (unless 条件 ……) と (when (not 条件) ……) とは同じ意味です。

(2023.5.28. 初版)
(2023.6.10. 改訂)

次へ 前へ 目次へ 佐々木将人の個人ページへ