[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
learning lisp: conditions
- To: bep@argv.org
- Subject: learning lisp: conditions
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Tue, 26 Jun 2001 13:07:28 +0900 (JST)
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
- User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.0.104 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)
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/