Skip to content

分岐・繰り返し

Snowman-s edited this page Mar 31, 2024 · 3 revisions

分岐

分岐は if0 もしくは ifn0 プロシージャで実現されます。

次のコードは、入力を受け付け、入力が "y" に等しいなら "yes" を、 そうでないなら "no" を出力します。

                 ┌─────┐
                 │print│
                 └──┬──┘
                 ┌──┴──┐
    ┌────────────┤ if  ├───┐
    │            └──┬──┘   │
   ┌┴┐           ┌──┴──┐┌──┴─┐
 ┌─┤=├──────┐    │"yes"││"no"│      
 │ └─┘      │    └─────┘└────┘
┌┴────────┐┌┴──┐
│read line││"y"│
└─────────┘└───┘

if(n)0 プロシージャは、条件リテラル・thenリテラル・elseリテラル を引数として受け取り、条件リテラルが0なら(0でないなら)、thenリテラルを、そうでないならelseリテラルを返り値とします。
引数は必ず一回実行されることに注意してください! 例えば以下のコードは入力にかかわらず "yes" と "no" を両方出力します!

                 ┌─────┐
    ┌────────────┤ if  ├───┐
    │            └──┬──┘   │
   ┌┴┐           ┌──┴──┐┌──┴──┐
 ┌─┤=├──────┐    │print││print│      
 │ └─┘      │    └──┬──┘└──┬──┘
┌┴────────┐┌┴──┐ ┌──┴──┐┌──┴──┐
│read line││"y"│ │"yes"││"no" │
└─────────┘└───┘ └─────┘└─────┘

これを回避するために、ブロッククォートを用いて以下のように書くことができます。

                 ┌─────┐
                 │exec │
                 └──┬──┘
                 ┌──┴──┐
    ┌────────────┤ if  ├───┐
    │            └──┬──┘   │
   ┌┴┐           ┌──•──┐┌──•──┐
 ┌─┤=├──────┐    │print││print│
 │ └─┘      │    └──┬──┘└──┬──┘
┌┴────────┐┌┴──┐ ┌──┴──┐┌──┴──┐
│read line││"y"│ │"yes"││"no" │
└─────────┘└───┘ └─────┘└─────┘

ブロッククォートについて詳しくはアドバンスドを参照ください。

繰り返し

繰り返しは for プロシージャにて行うことができます。

以下のコードは入力した整数値分だけ、「01234567...」 を出力します。

                 ┌─────┐
    ┌────────────┤ for │
    │         ┌──┤     │
┌───┴──────┐┌─┴─┐└──┬──┘
│str to int││"i"│┌──•──┐
└───┬──────┘└───┘│print│
┌───┴─────┐      └──┬──┘
│read line│      ┌──┴──┐
└─────────┘      │  i  │
                 └─────┘

for プロシージャは、回数・変数名・ブロックを受け取り、Rustでいう for <変数名> in 0..<回数> { <ブロック> } を実行します。
<ブロック> は通常ブロッククォートを用いるのが簡単です。ここでは「"┴" のかわりに "•" を使うものである」と思っておけば十分です。

ブロッククォートについて詳しくはアドバンスドを参照ください。