Common Lisp の制御構造
どれも特に指定されなければループ終了時に nil を返す。本体の直前に返り値を指定するところがある。
DOLIST
他の言語で range-based for とか foreach と呼ばれるもの。
(dolist (x '(a b c d)) (print x)) ;; => A B C D を出力し、nil に評価される。
DO
一番複雑なやつ。C の for に似ている。
(do ((i 0 (+ i 1))) ((> i 10)) (format t "~D~%" i)) ;; => 0 から 10 まで出力する。
C で書くと:
for (i = 0; i <= 10; i = i + 1) printf("%d\n", i);
テストが真になると終了するところが特殊。Ruby の until のようでもある。
終了テストの右に式を書くことで値を返すことができる。また、C と同じで本体は無くてもいい。
(do ((i 1 (1+ i)) ; i = 0 で始めて反復ごとにインクリメント。 (sum 0 (+ sum i))) ; sum = 0 で始めて i を加算していく。 ((> i 10) sum))) ; i = 11 になったら sum の値を返す。 ;; => 55
DOTIMES
Ruby の Integer#times のようなやつ。指定した回数反復する。
変数は0から始まって指定した値−1まで増加する。
(dotimes (i 10) (format t "~D~%" i)) ;; => 0 から 9 までを出力する。