DO

目的

繰り返し実行することもできるグループとして実行される一連の文を開始します。

構文

DO [while-until-spec]|[index = iteration-spec[,iteration-spec]…]| FOREVER | LOOP;

ここで、while-until-spec は次のようになります。

WHILE(test-expression)[UNTIL(test-expression)] 

または

UNTIL(test-expression)[WHILE(test-expression)]

ここで、

iteration-spec は次のようになります。

start[to-by-spec|repeat-spec][while-until-spec] 

ここで、

to-by-spec は次のようになります。

TO finish[BY increment]

または

BY increment[TO finish]

ここで、repeat-spec は次のようになります。

REPEAT next

パラメーター

test-expression
長さが 1 以上のビット文字列のスカラー値に評価される任意の式。test-expression は、値のビットのいずれかが 1 である場合は真となり、それ以外の場合は偽となります。test-expression はかっこで囲む必要があります。
index
スカラー変数への参照。
start、next、finishincrement
index に代入可能な式。

説明

DO 文は、グループで実行される一連の文を開始します。グループは実行不可能な文 END で終了します。

DO グループは DO 文の制御下で可変回数実行されます。

DO 文は、ON-unit として使用することはできませんが、IF 文の THEN 句または ELSE 句を含めて、あるいは WHEN 句または OTHERWISE 句のオブジェクトとして、手続き内または BEGIN ブロック内の任意の場所に記述できます。

DO FOREVER | DO LOOP
DO FOREVER;
...
END;

これは無限ループになります。GOTO 文または LEAVE 文を使用するか、プログラムを終了する以外に、このループを終了する方法はありません。

DO LOOP;
...
END;

これも同じです。

例:
DCL I FIXED BIN (15);

ON CONVERSION BEGIN;
     PUT SKIP LIST ('Conversion triggered');
     STOP;
END;

DO FOREVER;
    GET LIST (I) ;
    PUT LIST (I) ;
    PUT SKIP;
    IF I = 0 THEN
        LEAVE;
END;

以下のセクションでは、各 DO 文について説明します。これらすべての説明では、グループの文が 1 回、2 回、n 回といったように実行される場合に、DO グループからグループ外に制御が渡されることも、グループ内の文がスキップされることもないと想定できます。ただし、DO グループには、IF 文、その他の DO グループ、RETURN 文、実行順序を変更する GOTO 文を含めることができます。

単純ではない DO グループについては、DO グループの DO 文を実行する以外の方法でその DO グループに最初に制御を渡すことはできません。また、手続き呼び出しまたは関数呼び出し以外の方法で単純ではない DO グループから外部に制御が移された場合は、一般に、そのグループに制御を戻すことはできません。この規則に違反すると、予期しない結果になります。