ELISAプログラミング9:サイクル


while関数の原型
(while TEST BODY...)
たとえば:
(setq i 0)

(while (< i 10)
  (message "i = %d" i)
  (incf i))
結果は*Message*bufferにあります.
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
メッセージ関数は、結果を*Message*bufferに書き込み、C関数formatのフォーマットをサポートします.%dは整数を印刷することができます.
(incf i)毎回iに1を加える
遍歴リスト
この例のコードは、リスト内の各要素をどのように遍歴するかを示し、印刷します.
(setq animals '(gazelle giraffe lion tiger))
(defun print-elements-of-list (list)
       "Print each element of LIST on a line of its own."
       (while list
         (print (car list))
         (setq list (cdr list))))
(print-elements-of-list animals)
car関数はリストの最初の要素を返します.
cdr関数は、listの2番目の要素から始まる要素を新しいリストとして返します.
サイクルを中断
私達がよくあるbreakを実現するなら、次のJavaScriptコードのように循環します.
var x = total = 0;
while (true) {
  total += x;
  if (x++ > 10) {
    break;
  }
}
eLispにはこう書くべきです.
(setq x 0 total 0)
(catch 'break
  (while t
    (incf total x)
    (if (> (incf x) 10)
        (throw 'break total))))
catch関数は、中のthrow関数から返ってきたtotalを取得します.もちろん有効値を返す必要はなく、nilでいいです.
(throw'break nil)
今回のループをスキップ
throw/catchでcontintueを実現
(setq x 0 total 0)
(while (< x 100)
  (catch 'continue
    (incf x)
    (if (zerop (% x 5))
        (throw 'continue nil))
    (incf total x)))