(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