なでしこで分岐処理

日本語プログラミング言語「なでしこ」[Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nadesiko)が始まったと聞き、今まで自分で何か発信しようなんて考えたことが無かったのですが、皆さんの記事を拝見して「ちょっと新しいことにチャレンジしてみようかな」と思い立ちました。

自分が「なでしこ」でプログラミングをするときに困っていることは、**現バージョンでのサンプルプログラムが少ない**ということです。なでしこのマニュアルを見ても、サンプルが載っていないことも多く、手探りのトライ＆エラーでプログラムを書いている日々です。
そこで、自分が作ったソースが、どなたかの参考になればいいなという思いで、記事をまとめてみようかなと思います。こういうことをするのは初めてなので、いろいろと教えていただけるとうれしいです。よろしくお願いします。

この記事は、なでしこの[簡易エディタ](https://nadesi.com/doc3/index.php?%E3%81%AA%E3%81%A7%E3%81%97%E3%81%933%E7%B0%A1%E6%98%93%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)で実行できるようにしていますが、Windows版のv1や、最新のv3コンソール版でも動作します。

## 変数

「なでしこ」を初めて触る方向けの記事はたくさんあるので、そちらに譲りたいと思います。
とりあえず、「なでしこ」でいろいろな処理をしたいと思ったときに、変数を使う必要がありますが、書き方が何通りかあります。
一般的なプログラム言語と同じ、等号（＝）を使った書き方は、次のようになります。

```
A=12。
B=４。
C=A÷B。
Cを表示。
```
「なでしこ」っぽく、日本語で書くとこうなります。

```
Aに12を代入。
Bは４。
A÷BをCに代入。
Cを表示。
```
もちろん、変数名に日本語を使うことができます。変数名は「サイコロ」「明るさ」のように単語で指定するとよいと思います。「Aの明るさ」のように助詞を入れるとうまくいかないことがあります。

変数の値を表示するときは`Cを表示。`のように、変数名を直接記述します。他には、カギカッコ「　」の中で変数の内容を展開するために、中カッコ｛　｝を使う方法があります。

```
A=12。
B=４。
C=A÷B。
「｛A｝÷｛B｝＝｛C｝」を表示。
```


## 乱数

サイコロを振る命令を作りたいので、乱数を利用します。**サイコロ**という変数に、１～６までのどれか１つの値を代入します。

```
サイコロ＝（６の乱数）＋１。
```
`ｎの乱数`という命令で、０からｎ－１までの整数から１つを選んでくれます。上記のように`(６の乱数)＋１`とすれば、１から６までの整数から１つの値を選びます。

# おみくじをつくる

## 単純な分岐
最も単純な分岐処理を理解するために、おみくじを作ってみます。
サイコロを振り、値が１だったら「大吉」、２だったら「凶」と表示させます。次のように記述します。

```omikuji1.nako
おみくじ＝（６の乱数）＋１。
おみくじを表示。

もし、おみくじ＝１ならば
　　「大吉」と表示。
ここまで。

もし、おみくじ＝２ならば
　　「凶」と表示。
ここまで。
```
**もし、（条件式）ならば
　　（処理）
ここまで。**
の構文で単純な分岐処理になります。この場合、条件式がYES（はい）ならば「処理」を実行することになります。そのため、上記のサンプルを実行すると、「大吉」または「凶」と表示される...と思いきや、サイコロの値が３～６だった場合は何も表示されません。

## 「はい」「いいえ」の分岐
サイコロを振り、値が４～６だったら「大吉」、それ以外だったら「凶」にする場合は、次のように記述します。

```omikuji2.nako
おみくじ＝（６の乱数）＋１。
おみくじを表示。

もし、おみくじ≧４ならば
　　「大吉」と表示。
違えば
　　「凶」と表示。
ここまで。
```
**もし、（条件式）ならば
　　（YESの場合の処理）
違えば
　　（NOの場合の処理）
ここまで。**
の構文で、基本的な分岐処理を作れます。条件式を満たす（YESの）場合と、満たさない（NOの）場合の２通りに分かれます。
ちなみに、なでしこでは条件式の不等号に「以上（`≧`）」「以下（`≦`）」を使えます。わかりやすくていいですよね。

## ３通り以上の分岐
こうなれば、１～６までの６通りでおみくじを用意したいので、次のように記述します。

```omikuji3.nako
おみくじ＝（６の乱数）＋１。
おみくじを表示。

もし、おみくじ＝１ならば
　　「大吉」と表示。
違えばもし、おみくじ＝２ならば
　　「小吉」と表示。
違えばもし、おみくじ＝３ならば
　　「中吉」と表示。
違えばもし、おみくじ＝４ならば
　　「吉」と表示。
違えば
　　「凶」と表示。
ここまで。
```
**もし、（条件式１）ならば
　　（条件式１がYESの場合の処理）
違えばもし、（条件式２）ならば
　　（条件式２がYESの場合の処理）
違えば
　　（NOの場合の処理）
ここまで。**
の構文で、条件が３通り以上の分岐処理を作れます。条件式１と条件式２を共に満たさない場合は`違えば`の処理を実行します。
要するにこれは、
**if (条件式1） {
　　処理１
} elseif (条件式2) {
　　処理２
} else {
　　処理３
};**
みたいな感じです。

## 変数でスリムに？
処理自体は単純なので、おみくじ（＝乱数）の値によって表示するメッセージ（＝文字列）が違うだけなんです。それなら、メッセージにも変数を使えばいいじゃんということになりますが…。やってみました。

``` omikuji4.nako
おみくじ＝（６の乱数）＋１。
おみくじを表示。

もし、おみくじ＝１ならば
　　結果＝「大吉」。
違えばもし、おみくじ＝２ならば
　　結果＝「小吉」。
違えばもし、おみくじ＝３ならば
　　結果＝「中吉」。
違えばもし、おみくじ＝４ならば
　　結果＝「吉」。
違えば
　　結果＝「凶」。
ここまで。
結果を表示。
```

## おまけ　「条件分岐」構文
v1には**条件分岐**という命令があります。switch ～ case構文のようなものです。

```omikuji5.nako
おみくじ＝（６の乱数）＋１。
おみくじを表示。

おみくじで条件分岐
　　１ならば
　　　　「大吉」と表示。
　　２ならば
　　　　「小吉」と表示。
　　３ならば
　　　　「中吉」と表示。
　　４ならば
　　　　「吉」と表示。
　　違えば
　　　　「凶」と表示。
ここまで。
```
ブラウザ版のv3ではこの構文が使えないので`違えばもし`構文を使うことになります。

## 最後に
自分が「なでしこ」を使い始めたときに、分岐処理の書き方に迷ってしまうことがあったので、それを思い出しながらまとめてみました。

10日目の記事でsnowdrops89さんが[角丸サイコロを作って](https://qiita.com/snowdrops89/items/7c6aac54366f6df79f6a)いらっしゃるので、それを組み合わせると、見た目も楽しいおみくじになるかなと思います。

こんな記事が誰かの役に立つのだろうか…。まあいいや。やろうと思った気持ち（自己満足）と、困ったことの覚書を大事にします。また続きを書きたいと思います。

## 参考
- v1マニュアル - [制御構文](https://nadesi.com/doc/reference/syntax/1-6-koubun.htm)
- v3マニュアル - [制御構文について](https://nadesi.com/doc3/index.php?%E5%88%B6%E5%BE%A1%E6%A7%8B%E6%96%87%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)