Shammer's Philosophy

My private adversaria

Lisp の do (反復)

Lispでの繰り返し処理を行うための関数に、do と dolist というのがある。
とりあえず、do を使ってみる。
構文は以下。

(do (変数 初期値 更新方法)
  (反復終了の判定処理)
  (処理1)
  (処理2)
  ...
  (処理n))

以下、do を利用するサンプル。

(defun do-sample (start end)
  (do ((i start (+ i 1))) ; カウンタ変数の定義、初期値設定、更新方法を指定
      ((> i end) 'done) ; 反復終了の判定処理
      (format t "A~A " i)
      (format t "B~A " i)
      (format t "C~A " i)))

これを次のように実行すると、

(do-sample 1 10)
A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4 A5 B5 C5 A6 B6 C6 A7 B7 C7 A8 B8 C8 A9 B9 C9 A10 B10 C10 
DONE

となる。トップレベルにいきなり do の処理を書くことはできないのだろうか。
以下のように試してみたが、

(do (i 0 (+ i 1))
  ((> i 10) 'done)
  (format t "~A " i))

うまくいかなかった。出てきたエラーはこれ。

> Error: While compiling an anonymous function :
>        0 is not a symbol., in process Listener(6).
> Type cmd-/ to continue, cmd-. to abort, cmd-\ for a list of available restarts.
> If continued: continue compilation ignoring this form
> Type :? for other options.

意味がわからなかった・・・そのうち、わかってくるだろう。