次へ 前へ 目次へ 佐々木将人の個人ページへ
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. 改訂)
次へ 前へ 目次へ 佐々木将人の個人ページへ