DO WHILE (ObjectScript)
構文
DO {code} WHILE expression,...
D {code} WHILE expression,...
引数
引数 | 説明 |
---|---|
code | 中括弧で囲まれた ObjectScript コマンドのブロックです。 |
expression | ブーリアン・テスト条件式、またはコンマで区切られたブーリアン・テスト条件式のリストです。オプションで、この式を括弧で囲むことができます。 |
説明
DO WHILE は code を実行し、expression を評価します。expression が True と評価される場合、DO WHILE はループし、code を再実行します。expressionが True と評価されない場合、code は実行されず、DO WHILE の後続のコマンドが実行されます。
DO WHILE は常に、ブロック型形式で記述されることに注意してください。実行されるコードは DO と WHILE キーワードの間に配置され、{ } で囲まれます。
開き中括弧や閉じ中括弧は、1 行で独立して記述するか、コマンドと同じ行に記述できます。開き中括弧や閉じ中括弧は、列 1 に記述してもかまいませんが、お勧めはできません。推奨されるプログラミング手法として、入れ子になったコード・ブロックの開始と終了を示すために、中括弧はインデントするようにしてください。開き中括弧の前後に空白を入れる必要はありません。閉じ中括弧の前後に空白を入れる必要はありません。WHILE キーワードと、括弧で囲んだ expression との間に空白は必要ありません。閉じ中括弧と WHILE キーワードの間にコメントが表示される場合があります。
DO キーワードは短縮される場合があります。
(関連しない DO コマンドとは異なり) DO WHILE は、新しい実行レベルを作成しません。NEW や SET $ZTRAP など、DO WHILE ループ間に呼び出され、実行レベルの影響を受けるコマンドは、ループの終了後も引き続き有効です。
引数
code
1 つ、または複数の Objectscript コマンドのブロックです。コード・ブロックは数行にわたることがあります。コード・ブロックは、中括弧 ({ }) で囲まれます。コード・ブロックとコマンド内の引数の内部にあるコマンドとコメントは、1 つ、または複数の空白スペースや改行で区切られます。しかし、すべての ObjectScript コマンドのように、各コマンド・キーワードとその最初の引数は必ず 1 つのスペースで区切る必要があります。
expression
単一の式、またはコンマで区切られた式のリストの形式をとるテスト条件。式リストでは、InterSystems IRIS は左から右の順で、個別の式を評価します。False である式に遭遇すると評価を終了します。すべての式が True と評価された場合、InterSystems IRIS は code コマンドを再実行します。DO WHILE は、各ループに対する expression をテストしながら、繰り返し実行されます。式が 1 つでも False と評価されると、InterSystems IRIS は残りの式を無視し、ループも行われません。そして、DO WHILE の後のコマンドから実行されます。
ObjectScript は、厳密に左から右の順に式を評価します。プログラマは、括弧を使用して優先順位を確立する必要があります。
InterSystems IRIS は code を実行する前に expression の検証を実行しません。したがって、DO WHILE はその code ループを常に 1 回実行します。expression を正常に実行できるかどうかは関係ありません。
DO WHILE と WHILE
DO WHILE コマンドはループを一度実行し、そして expression をテストします。WHILE コマンドは、ループを実行する前に expression をテストします。
DO WHILE と CONTINUE
DO WHILE コマンドの code ブロック内で CONTINUE コマンドに遭遇すると、実行が即座に WHILE キーワードにジャンプします。次に DO WHILE コマンドは WHILE expression テスト条件を評価し、その評価を基にして code ブロック・ループを再実行するかどうかを決定します。したがって、CONTINUE コマンドの実行は code ブロックの終了中括弧に到達するのとまったく同じ効果があります。
以下の例は、奇数ループの結果のみを表示します。
SET x=0
DO {SET x=x+1 IF x#2=0 {CONTINUE} WRITE !,"Loop ",x} WHILE x<20
WRITE !,"DONE"
DO WHILE、QUIT、RETURN
code ブロック内の QUIT コマンドは DO WHILE ループを終了させ、WHILE キーワードに続くコマンドへ実行を移します。以下はその例です。
Testloop
SET x=1
DO {
WRITE !,"Looping",x
QUIT:x=5
SET x=x+1
} WHILE x<10
WRITE !,"DONE"
このプログラムは、Looping1 から Looping5 までを書き込み、その後 DONE を書き込みます。
DO WHILE コード・ブロックは入れ子にできます。つまり、DO WHILE コード・ブロックに、別のフロー制御ループ (別の DO WHILE、あるいは FOR または WHILE コード・ブロック) を含むことができます。内側の入れ子となったループの QUIT では、内側のループが終了して、そのループの外側のループに実行が移ります。詳細は、以下の例を参照してください。
Nestedloops
SET x=1,y=1
DO {
WRITE "outer loop ",!
DO {
WRITE "inner loop "
WRITE " y=",y,!
QUIT:y=7
SET y=y+2
} WHILE y<100
WRITE "back to outer loop x=",x,!!
SET x=x+1
} WHILE x<6
WRITE "Done"
RETURN を使用すると、DO WHILE ループや入れ子のループ構造内を含む任意の場所からルーチンの実行を終了させることができます。RETURN は常に現在のルーチンを終了し、呼び出し元のルーチンに戻るか、呼び出し元のルーチンがない場合はプログラムを終了します。RETURN は、コード・ブロック内から発行されたかどうかに関係なく、常に同じ動作を行います。
DO WHILE と GOTO
code ブロック内の GOTO コマンドは、ループ外のラベルへ実行をダイレクトし、ループを終了します。(ラベルはタグと呼ばれることもあります。)code ブロック内の GOTO コマンドは、同じ code ブロック内のラベルへ実行をダイレクトする場合があります。入れ子になったコード・ブロックを終了するために、GOTO を使用できます。サポートはされていますが、他の GOTO の使用法はお勧めしません。
以下の例では、GOTO を使用して DO WHILE ループを終了します。
mainloop
DO {
WRITE !,"In an infinite DO WHILE loop"
GOTO label1
WRITE !,"This should not display"
} WHILE 1=1
WRITE !,"This should not display"
label1
WRITE !,"Went to label1 and quit"
QUIT
以下の例では、GOTO を使用して DO WHILE ループ内で実行を移動します。
mainloop ; Example of a GOTO to within the code block
SET x=1
DO {
WRITE !,"In the DO WHILE loop"
GOTO label1
WRITE !,"This should not display"
label1
WRITE !,"Still in the DO WHILE loop after GOTO"
SET x=x+1
WRITE !,"x= ",x
} WHILE x<3
WRITE !,"DO WHILE loop done"
例
以下の例では、最初の DO WHILE は式が True で、次の DO WHILE は False です。式が False の場合、そのコード・ブロックは一度だけ実行されます。
DoWhileTrue
SET x=1
DO {
WRITE !,"Looping",x
SET x=x+1
} WHILE x<10
WRITE !,"DONE"
このプログラムは、Looping1 から Looping9 までを書き込み、その後 DONE を書き込みます。
DoWhileFalse
SET x=11
DO {
WRITE !,"Looping",x
SET x=x+1
} WHILE x<10
WRITE " DONE"
このプログラムは、Looping11 DONE を書き込みます。