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

learning lisp: while



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/