Euphoria-flow-control

提供:Dev Guides
移動先:案内検索

陶酔-フロー制御

プログラム実行フローとは、プログラム文が実行される順序を指します。 デフォルトでは、ステートメントは次々に実行されます。

しかしながら;多くの場合、タスクを完了させるために、実行の順序をデフォルトの順序から変更する必要があります。

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