do

Title
do
Type
Macro
Arguments
do (&rest VARLIST) (&optional END-TEST &rest RESULT) &body BODY
Package
lisp
Section
制御構造
File
evalmacs.l
(do ((var1 init1 step1)
     (var2 init2 step2)
            ...
     (varm initm stepm))
    (end-test result1 result2 ... resultm) 
   declaration1
       ...
   declarationN)

(do ((<変数1> <初期値1> <ステップ1>)
     (<変数2> <初期値2> <ステップ2>)
              ...
     (<変数m> <初期値m> <ステップm>))
    (<<終了条件> <後式1> ... <後式p>) 
   <式1>
   ...
   <式n>)


<変数1>〜<変数m>までを局所変数とし,<終了条件>が真
になるまでdo式本体の<式1>〜<式n>を繰り返し実行する。<
変数1>〜<変数m>までは変数を表す記号で,do式の中で局所的に使
われる変数を指定する。do式が評価されるときは,まず<初期値1>〜
<初期値m>までが評価され,その値が各局所変数にバインドされる。そ
の後で,<終了条件>が評価され,もし値がnilであれば本体を実行する。
次に<ステップ1>〜<ステップm>までを評価してその値を各局所
変数に代入してから<終了条件>を評価する。これを<終了条件>
の値がnil以外になるまで繰り返す。<終了条件>の値がnil以外になっ
たら,<終了条件>に続く<後式1>〜<後式p>を評価し,そ
の最後の式の値をdo式の値とする。

do式の一般形は,

(block nil
  (let ((<変数1> <初期値1> <ステップ1>)
        (<変数2> <初期値2> <ステップ2>)
                 ...
        (<変数m> <初期値m> <ステップm>))
    (tagbody
      loop
      (when <終了条件>
        (return (progn <後式1> ... <後式p>)))
      <式1>
      ...
      <式n>
     (psetq <変数1> <ステップ1>
              ...
            <変数m> <ステップm>)
      (go loop))))

と同値である。(loop というタグは他では使われていないものとする)