Shammer's Philosophy

My private adversaria

Lispのdoループ(その2)

以前やったとき、うまくいかなかったのは単に構造、というか括弧の付け方を間違えていただけと判明。以下のようにすることでうまくいった。

(do ((i 0 (incf i)))
      ((< 10 i))
  (format t "~A " i))

括弧の使い方に間違いがあった。再度、doの構文を確認。

(do ((value1 value1-initial-value value1-next-value)
       (value2 value2-initial-value value2-next-value)
       ...
       (valueN valueN-initial-value valueN-next-value))
       ((finish-judgement-1 ...))
  (body-functions ...))

こんな感じのはず。また括弧の数間違えていたらイヤだな・・・
気を付けないといけないのは、

  • ループ内で使用する変数は、変数名、初期値、次のループで使用(判定)される値に更新する式
  • 終了判定も複数指定できるので、終了判定ブロック内には終了判定文ごとの括弧が必要

という点だろうか。文章で書くのはちょっと難しいかも。とりあえず、やりながら慣れていくしかない。