[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

learning lisp: conditions



n高橋です。条件分岐・邪道編です。

Reiko TAKAHASHI  (高橋玲子)writes:

>  (and ...) と (or ...) の意味に関して、nil があるかどうかを見たいときに
> は (and) を使い、t があるかどうかを見たいときには (or) を使う、みたいな感
> 覚を覚えておくのもいいかなと思いました。

そういう感覚も大事だと思います。

ちなみに、古いプログラムの中には、if の代わりに and とか or を使ってい
るものもあります。

(if (= a 0) (setq b 0)) ; aが0ならbにも0をセット

の代わりに

(and (= a 0) (setq b 0))

と書いたり、

(if (not (= a 0)) (setq b 1)) ; aが0以外だったらbに1をセット

の代わりに

(or (= a 0) (setq b 1))

と書いたりするのです。特に

; a, b, c がすべて0だったらxにも0をセット
(if (and (= a 0) (= b 0) (= c 0))
    (setq x 0))

のように if の条件部分が and (または or) でくくられているときは

(and (= a 0)
     (= b 0)
     (= c 0)
     (setq x 0))

のようにまとめることができます。or に関しても似たような手が使えます。
慣れれば読めますけど、あまり良い書き方ではありませんね。

また、以前話が出たように、if の条件が成功したはS式が一つしか書けません
が、失敗したときは何個でもS式が書けます。成功したときに複数のS式を書き
たいときは progn でくくって、

; aが0なら関数 fx, fy, fz それぞれに 1, 2, 3 という引数を与えて評価
(if (= a 0)
    (progn (fx 1) (fy 2) (fz 3)))

のように書く必要があります。これをきらってわざと条件に not を付け、

(if (not (= a 0))
    nil
  (fx 1)
  (fy 2)
  (fz 3))

と書く人もいました。が、今ならこんなことをしなくても when と unless と
いう便利なものが使えます。

(when 条件 S式1 S式2 ...)

は、「条件」が成立したときに「S式1」「S式2」...をこの順に評価し、最後
のS式の値を返します。「条件」が成立しないときは何もせずに nil を返しま
す。

反対に

(unless 条件 S式1 S式2 ...)

は、「条件」が成立しなかったとき、すなわち「条件」の評価値が nil になっ
たときに「S式1」「S式2」...をこの順に評価し、最後のS式の値を返します。
「条件」が成立したときは何もせずに nil を返します。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/