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 までを出力する。