(do ((var1 init1 {step1})
...
(varn initn {stepn}))
(TestCondition ReturnValue)
body)
まず、変数 var1 .. varn が 初期値 init1 .. initn で生成されます。
その後、繰り返し動作が行われ続けます。
繰り返しの冒頭では、まず式 TestCondition が実行され、成立した場合は
式 ReturnValue の値を返します。
TestCondition に失敗した場合、body 部を実行し、
その後、各変数を stepi の値で更新します(省略されている場合は変更無し)。
たとえば、 1 から n までの足し算を行う関数 sumup は、以下の様に定義できます。
(define (sumup n)
(do ((counter 1 (+ counter 1))
(result 0))
((> counter n) result)
(set! result (+ result counter))))
実は、これと、以下の C のプログラムはあまり違いません。
int sumup(int n) {
int counter;
int result;
for(counter = 1,result = 0; /* init: 初期値 */
!(counter > n); /* ConditionTest: 繰り返し条件 */
counter++) { /* step: 更新値 */
result = result + counter; /* body: 繰り返し本体 */
}
return result; /* ReturnValue: 帰り値 */
}
99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp