[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
learning lisp: while
- To: bep@argv.org
- Subject: learning lisp: while
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Tue, 26 Jun 2001 13:45:40 +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高橋です。条件分岐をやったんならループもやらなくっちゃね。
Emacs Lisp でループ(くり返し)を行うには while を使います。
(while 条件 S式1 S式2 ...)
は、「条件」が成立している間、「S式1」「S式2」...をくり返し実行します。
簡単な類を示します。
(defun sigma (n)
(let ((i 1) (s 0))
(while (<= i n)
(setq s (+ s i))
(setq i (1+ i)))
s))
これは1からnまでの数をすべて足すプログラムです。前にやった fact もこれ
と同じような形に書き直せますので、時間があったらチャレンジしてみて下さ
い。また反対に、上の sigma を while でなく再帰で書くこともできます。
while でよくやる失敗は、ループ変数の更新を忘れて無限ループしてしまうこ
とです。上の例では (setq i (1+ i)) を入れ忘れるのがこれに当たります。
こうなったら C-g でストップさせるしかありません。
先に再帰の説明をしておいてアレなんですが、一般にはループで済むのならルー
プを使い、再帰は使わない方が普通です。再帰は非常に Lisp 的なのですが、
実行時間と使用するメモリの点でループよりも重い処理になるからです。
--
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/