ELISAプログラミング9:サイクル
1505 ワード
while関数の原型
(incf i)毎回iに1を加える
遍歴リスト
この例のコードは、リスト内の各要素をどのように遍歴するかを示し、印刷します.
cdr関数は、listの2番目の要素から始まる要素を新しいリストとして返します.
サイクルを中断
私達がよくあるbreakを実現するなら、次のJavaScriptコードのように循環します.
(throw'break nil)
今回のループをスキップ
throw/catchでcontintueを実現
(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)))