差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン | |||
tutorial:nim:control_flow [2024/08/20 02:05] – ↷ tutorial:nim:control-flow から tutorial:nim:control_flow へページを名称変更しました。 freemikan | tutorial:nim:control_flow [2025/05/20 11:21] (現在) – 削除 freemikan | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== 制御フロー ====== | ||
- | プログラムの流れを制御するための構造を制御フローと呼ぶことにします。Nimの制御フローには、条件分岐とループに大別できます。条件分岐にはifとcaseがあります。ループにはwhileとforがあります。 | ||
- | |||
- | ===== if文 ===== | ||
- | |||
- | 条件によってプログラムの流れを制御するには、if文を使います。if文は次のように書きます。 | ||
- | |||
- | <file nim> | ||
- | let x = 99 | ||
- | if x < 100: | ||
- | echo "x is less than 100" | ||
- | </ | ||
- | |||
- | このプログラムを実行すると、// | ||
- | |||
- | Nimではブロックを表現するために[[wpjp> | ||
- | |||
- | '' | ||
- | |||
- | <file nim> | ||
- | let x = 200 | ||
- | if x < 100: | ||
- | echo "x is less than 100" | ||
- | elif x < 200: | ||
- | echo "x is less than 200" | ||
- | elif x < 300: | ||
- | echo "x is less than 300" | ||
- | else: | ||
- | echo " | ||
- | </ | ||
- | |||
- | このプログラムを実行すると、// | ||
- | |||
- | |||
- | ===== case文 ===== | ||
- | |||
- | 条件分岐にはもう一つcase文があります。一つの変数に対して多数の条件で処理を分岐する場合には、if文よりもcase文の方が適しています。先のifを使った例は、次のように書き換えられます。 | ||
- | |||
- | <file nim> | ||
- | let x = 200 | ||
- | case x | ||
- | of low(int)..99: | ||
- | echo "x is less than 100" | ||
- | of 100..199: | ||
- | echo "x is less than 200" | ||
- | of 200..299: | ||
- | echo "x is less than 300" | ||
- | else: | ||
- | echo " | ||
- | </ | ||
- | |||
- | '' | ||
- | |||
- | この場合、elseのブロックは必須です。case文では、条件となる値の全てのケースをカバーしなければなりません。カバーしていない場合はコンパイルエラーとなります。 | ||
- | |||
- | <file nim> | ||
- | let x = 100 | ||
- | case x | ||
- | of 0..99: | ||
- | echo "x is less than 100" | ||
- | </ | ||
- | |||
- | コンパイルすると次のようなエラーになります。 | ||
- | |||
- | Error: not all cases are covered | ||
- | |||
- | elseで何もやることがない場合は、'' | ||
- | |||
- | <file nim> | ||
- | let x = 100 | ||
- | case x | ||
- | of 0..99: | ||
- | echo "x is less than 100" | ||
- | else: | ||
- | discard | ||
- | </ | ||
- | |||
- | このプログラムは正常にコンパイルされ、実行すると何も出力されません。 | ||
- | |||
- | case文では、範囲以外にも複数の値を一つの分岐に使用したり、 | ||
- | |||
- | <file nim> | ||
- | let x = 100 | ||
- | case x | ||
- | of 10, 100, 1000: | ||
- | echo "x is power of 10 (but limited to very small range)" | ||
- | else: | ||
- | discard | ||
- | </ | ||
- | |||
- | 文字列を条件に使用したり出来ます。 | ||
- | |||
- | <file nim> | ||
- | let s = " | ||
- | case s | ||
- | of "": | ||
- | echo " | ||
- | of " | ||
- | echo "You say ", s | ||
- | else: | ||
- | discard | ||
- | </ | ||
- | |||
- | ===== while文 ===== | ||
- | |||
- | while文は条件が成立する間、ブロックを実行し続けます。 | ||
- | |||
- | <file nim> | ||
- | var x = 0 | ||
- | while x < 10: | ||
- | echo " | ||
- | x += 1 | ||
- | </ | ||
- | |||
- | 実行すると、次の出力が得られます。 | ||
- | |||
- | hello0 | ||
- | hello1 | ||
- | hello2 | ||
- | hello3 | ||
- | hello4 | ||
- | hello5 | ||
- | hello6 | ||
- | hello7 | ||
- | hello8 | ||
- | hello9 | ||
- | |||
- | 条件には、任意の式を使用することが出来ます。 | ||
- | |||
- | |||
- | |||
- | ===== for文 ===== | ||
- | |||
- | for文は、while文よりも一定のパターンに従ったループを表現するのに適しています。先のwhileループをforループに置き換えると次のようにまります。 | ||
- | |||
- | <file nim> | ||
- | for i in countup(0, 9): | ||
- | echo " | ||
- | </ | ||
- | |||
- | あるいは、次のようにも出来ます。 | ||
- | |||
- | <file nim> | ||
- | for i in 0..<10: | ||
- | echo " | ||
- | </ | ||
- | |||
- | どちらも先のwhileループと同じ出力が得られます。 | ||
- | |||
- | '' | ||
- | |||
- | <file nim> | ||
- | for fruit in [" | ||
- | echo fruit | ||
- | </ | ||
- | |||
- | このプログラム実行すると、次の出力が得られます。 | ||
- | |||
- | apple | ||
- | orange | ||
- | grape | ||
- | |||
- | インデックスと値を同時に取得することも出来ます。 | ||
- | |||
- | <file nim> | ||
- | for (i, fruit) in [" | ||
- | echo i, " => ", fruit | ||
- | </ | ||
- | |||
- | このプログラム実行すると、次の出力が得られます。 | ||
- | |||
- | 0 => apple | ||
- | 1 => orange | ||
- | 2 => grape | ||
- | |||
- | 他にもいろいろなケースがあります。 | ||
- | |||
- | ===== break文とcontinue文 ===== | ||
- | |||
- | break文はループを終了します。 | ||
- | |||
- | <file nim> | ||
- | var x = 0 | ||
- | while true: | ||
- | if x < 10: | ||
- | echo x | ||
- | else: | ||
- | break | ||
- | inc x | ||
- | </ | ||
- | |||
- | このプログラムを実行すると、次の出力が得られます。 | ||
- | |||
- | 0 | ||
- | 1 | ||
- | 2 | ||
- | 3 | ||
- | 4 | ||
- | 5 | ||
- | 6 | ||
- | 7 | ||
- | 8 | ||
- | 9 | ||
- | |||
- | continue文は、現在のブロックの残りの処理をスキップして、次のループ開始位置まで戻ります。 | ||
- | |||
- | <file nim> | ||
- | for x in 0..<10: | ||
- | if x %% 2 == 0: | ||
- | continue | ||
- | echo x | ||
- | </ | ||
- | |||
- | このプログラムを実行すると、次の出力が得られます。 | ||
- | |||
- | 1 | ||
- | 3 | ||
- | 5 | ||
- | 7 | ||
- | 9 | ||
- | |||
- | break文もcontinue文も、対象となるループ文は現在実行している位置の直近のループ文のみであることに注意してください。 | ||
- | |||
- | <file nim> | ||
- | var x = 0 | ||
- | while x < 10: | ||
- | while true: | ||
- | if x %% 3 == 0: | ||
- | echo x | ||
- | else: | ||
- | break # もっとも内側のwhileから抜ける | ||
- | inc x | ||
- | inc x | ||
- | </ | ||
- | |||
- | このブログラムを実行すると、次の出力が得られます。 | ||
- | |||
- | 0 | ||
- | 3 | ||
- | 6 | ||
- | 9 | ||
- | |||
- | 外側のwhile文からは抜け出ませんので、外側のwhileの条件である'' |