Euphoria-flow-control
陶酔-フロー制御
プログラム実行フローとは、プログラム文が実行される順序を指します。 デフォルトでは、ステートメントは次々に実行されます。
しかしながら;多くの場合、タスクを完了させるために、実行の順序をデフォルトの順序から変更する必要があります。
Euphoriaには、ステートメントの実行順序を調整するために使用できる多数の_flow_制御ステートメントがあります。
_exit_ステートメント
ループを終了するには、キーワード exit を使用します。 これにより、フローはすぐに現在のループを離れ、ループの終了後に最初のステートメントから再開します。
構文
exit文の構文は次のとおりです-
exit [ "Label Name" ] [Number]
*exit* ステートメントは、オプションのラベル名または番号が指定されるまで、最新の最も内側のループを終了します。
*exit N* の特別な形式は *exit 0* です。 これにより、深さに関係なく、すべてのレベルのループが残ります。 制御は、最も外側のループブロックの後に続きます。 同様に、exit -1は2番目に外側のループを終了します。
例
#!/home/euphoria-4.0b2/bin/eui
integer b
for a = 1 to 16 do
printf(1, "value of a %d\n", a)
if a = 10 then
b = a
exit
end if
end for
printf(1, "value of b %d\n", b)
これは、次の結果を生成します-
value of a 1
value of a 2
value of a 3
value of a 4
value of a 5
value of a 6
value of a 7
value of a 8
value of a 9
value of a 10
value of b 10
_break_ステートメント
*break* ステートメントは *exit* ステートメントとまったく同じように機能しますが、あらゆる種類のループステートメントではなく、ifステートメントまたはswitchステートメントに適用されます。
構文
breakステートメントの構文は次のとおりです-
break [ "Label Name" ] [Number]
*break* ステートメントは、オプションのラベル名または番号が指定されるまで、最新かつ最も内側のifまたはswitchブロックを終了します。
*break N* の特別な形式は *break 0* です。 これにより、深さに関係なく、ifブロックまたはswitchブロックが最も外側になります。 制御は、最も外側のブロックの後に続きます。 同様に、break -1は、2番目に外側のifブロックまたはswitchブロックなどを中断します。
例
#!/home/euphoria-4.0b2/bin/eui
integer a, b
sequence s = {'E','u', 'p'}
if s[1] = 'E' then
a = 3
if s[2] = 'u' then
b = 1
if s[3] = 'p' then
break 0 -- leave topmost if block
end if
a = 2
else
b = 4
end if
else
a = 0
b = 0
end if
printf(1, "value of a %d\n", a)
printf(1, "value of b %d\n", b)
これは、次の結果を生成します-
value of a 3
value of b 1
_continue_ステートメント
*continue* ステートメントは、次の反復に進み、反復の残りをスキップすることにより、適用されるループの実行を継続します。
次の反復に進むということは、条件変数インデックスをテストし、それがまだ境界内にあるかどうかをチェックすることを意味します。
構文
continueステートメントの構文は次のとおりです-
continue [ "Label Name" ] [Number]
*continue* ステートメントは、オプションのラベル名または番号が指定されるまで、最新かつ最も内側のループを繰り返します。
*continue N* の特別な形式は、 *continue 0* です。 これにより、深さに関係なく、最も外側のループが繰り返されます。 同様に、continue -1は2番目に外側のループから始まり、以下同様に続きます。
例
#!/home/euphoria-4.0b2/bin/eui
for a = 3 to 6 do
printf(1, "value of a %d\n", a)
if a = 4 then
puts(1,"(2)\n")
continue
end if
printf(1, "value of a %d\n", a*a)
end for
This would produce following result:
value of a 3
value of a 9
value of a 4
(2)
value of a 5
value of a 25
value of a 6
value of a 36
_retry_ステートメント
*retry* ステートメントは、次の反復に進み、残りの反復をスキップすることにより、適用されるループの実行を継続します。
構文
再試行ステートメントの構文は次のとおりです-
retry [ "Label Name" ] [Number]
*retry* ステートメントは、適用されるループの現在の反復の実行を再試行します。 ステートメントは、指定されたループの最初のステートメントに分岐し、何もテストせず、forループインデックスをインクリメントしません。
*retry N* の特別な形式は *retry 0* です。 これは、深さに関係なく、最も外側のループの実行を再試行します。 同様に、retry -1は2番目に外側のループを再試行します。
通常、再試行ステートメントを含むサブブロックには、exit、continue、breakなどの別のフロー制御キーワードも含まれます。 それ以外の場合、反復は無限に実行されます。
例
#!/home/euphoria-4.0b2/bin/eui
integer errors = 0
integer files_to_open = 10
for i = 1 to length(files_to_open) do
fh = open(files_to_open[i], "rb")
if fh = -1 then
if errors > 5 then
exit
else
errors += 1
retry
end if
end if
file_handles[i] = fh
end for
再試行はiの値を変更せずに同じファイルを再度開くため、exitステートメントが提供するループから抜け出す方法が必要です。
gotoステートメント
*goto* ステートメントは、ラベル付けされた場所でコードの実行を再開するようにコンピューターに指示します。
実行を再開する場所は、ステートメントのターゲットと呼ばれます。 現在のルーチン、またはルーチン外の場合は現在のファイルに存在するように制限されています。
構文
gotoステートメントの構文は次のとおりです-
goto "Label Name"
gotoステートメントのターゲットは、アクセス可能な任意の label ステートメントにすることができます-
label "Label Name"
ラベル名は、二重引用符で囲まれた定数文字列でなければなりません。 Euphoria識別子で違法な文字は、通常の文字列であるため、ラベル名に表示される場合があります。
例
#!/home/euphoria-4.0b2/bin/eui
integer a = 0
label "FIRST"
printf(1, "value of a %d\n", a)
a += 10
if a < 50 then
goto "FIRST"
end if
printf(1, "Final value of a %d\n", a)
これは、次の結果を生成します-
value of a 0
value of a 10
value of a 20
value of a 30
value of a 40
Final value of a 50