はじめに
日本語プログラミング言語なでしこ3のGo言語版が正式にリリースされたようですので、さっそくVSCodeのターミナルからインストールして動かしてみました。本記事ではなでしこv1で動いていた少し立て込んだロジックのソースをなでしこ3(Go版)で動くようにしてみたというお話です。
なでしこ3(Go版)のインストール
お手数ですが詳しくはこちらの記事をご参照ください。
なでしこ3(Go版)のgitレポジトリのローカルクローン
お手数ですが詳しくはこちらの記事をご参照ください。
お題のソースコード
お題のソースコード下記の記事で動かしていたものです。
selectsort.nako
段ボール箱は「19
18
17
16
15
14
13
12
11
10
9
8
7
6
5」。
選択ソートする。
●選択ソートする
「整列前 」を表示
「要素番号 」を継続表示
段ボール箱で反復し
「{回数-1} 」を継続表示
ここまで
「」を表示
「ボール数 」を継続表示
段ボール箱で反復し
「{それ} 」を継続表示
ここまで
「」を表示
「」を表示
開始要素番号は整数
最小値要素番号は整数
一時退避のボール数は整数
箱要素数は整数
段ボール箱の配列要素数を箱要素数に代入
開始要素番号=0
1の間
もし、開始要素番号>箱要素数-1ならば、抜ける
ここまで
開始要素番号で線形探索し、
それを最小値要素番号に代入
もし、開始要素番号<>最小値要素番号ならば
段ボール箱[開始要素番号]を一時退避のボール数に代入
段ボール箱[最小値要素番号]を段ボール箱[開始要素番号]に代入
一時退避のボール数を段ボール箱[最小値要素番号]に代入
//処理経過表示処理ここから
「 要素番号{開始要素番号}と{最小値要素番号}を入れ替えました。」を継続表示
「{段ボール箱[開始要素番号]} ⇔ {段ボール箱[最小値要素番号]}」を表示
//処理経過表示処理ここまで
ここまで
開始要素番号=開始要素番号+1
ここまで
「 」を表示
「整列後 」を表示
「要素番号 」を継続表示
段ボール箱で反復し
「{回数-1} 」を継続表示
ここまで
「」を表示
「ボール数 」を継続表示
段ボール箱で反復し
「{それ} 」を継続表示
ここまで
「」を表示。
現在の要素番号は整数
最小値要素番号は整数
箱要素数は整数
現在ボール数は整数
最小ボール数は整数
●線形探索(開始要素番号で)
最小値要素番号=開始要素番号
現在の要素番号=開始要素番号+1
段ボール箱の配列要素数を箱要素数に代入
1の間
もし、現在の要素番号>箱要素数-1ならば、抜ける
ここまで
現在ボール数=段ボール箱[現在の要素番号]を整数変換
最小ボール数=段ボール箱[最小値要素番号]を整数変換
もし、最小ボール数>現在ボール数ならば
最小値要素番号=現在の要素番号
ここまで
現在の要素番号=現在の要素番号+1
ここまで
最小値要素番号で戻る。
修正後のソースコード
selectsort.nako
段ボール箱は[19,18,17,16,15,14,13,12,11,10,9,8,7,6,5]。
選択ソートする。
●選択ソートするとは
「整列前 」を表示
「要素番号 」を継続表示
段ボール箱を反復
「{対象キー} 」を継続表示
ここまで
「」を表示
「ボール数 」を継続表示
段ボール箱を反復
「{それ} 」を継続表示
ここまで
「」を表示
「」を表示
開始要素番号は整数
最小値要素番号は整数
退避ボール数は整数
箱要素数は整数
段ボール箱の配列要素数を箱要素数に代入
開始要素番号=0
1の間
もし、開始要素番号>箱要素数-1ならば
抜ける
ここまで
開始要素番号で線形探索し、それを最小値要素番号に代入
もし、開始要素番号<>最小値要素番号ならば
段ボール箱[開始要素番号]を退避ボール数に代入
段ボール箱[最小値要素番号]を段ボール箱[開始要素番号]に代入
退避ボール数を段ボール箱[最小値要素番号]に代入
//処理経過表示処理ここから
「 要素番号{開始要素番号}と{最小値要素番号}を入れ替えました。」を継続表示
「{段ボール箱[開始要素番号]} ⇔ {段ボール箱[最小値要素番号]}」を表示
//処理経過表示処理ここまで
ここまで
開始要素番号=開始要素番号+1
ここまで
「 」を表示
「整列後 」を表示
「要素番号 」を継続表示
段ボール箱を反復
「{対象キー} 」を継続表示
ここまで
「」を表示
「ボール数 」を継続表示
段ボール箱を反復
「{それ} 」を継続表示
ここまで
「」を表示
ここまで
現在要素番号は整数
最小値要素番号は整数
箱要素数は整数
現在ボール数は整数
最小ボール数は整数
●線形探索(開始要素番号で)とは
最小値要素番号=開始要素番号
現在要素番号=開始要素番号+1
段ボール箱の配列要素数を箱要素数に代入
1の間
もし、現在要素番号>箱要素数-1ならば
抜ける
ここまで
現在ボール数=段ボール箱[現在要素番号]を整数変換
最小ボール数=段ボール箱[最小値要素番号]を整数変換
もし、最小ボール数>現在ボール数ならば
最小値要素番号=現在要素番号
ここまで
現在要素番号=現在要素番号+1
ここまで
最小値要素番号で戻る
ここまで
修正内容報告
なでしこ3(Go版)の新構文はほぼわかっていないので、本件はGitHub Copilotに外部委託です。けっこう苦戦していました。しかしながら、自力で実行してソースのレポジトリのソースから修正内容を考察して最後は動くようにしていく様は感動的ですらありました。(わたしの中では自動的に動くようになるのはまだまだめずらしい)
# 選択ソート修正プラン完了レポート v2
## 実施内容
- 配列の反復をGo版パーサの書式 `配列を反復` に統一した。整列前後の要素番号・値表示に
使う4か所を修正した。
- `ならば、抜ける` の一行条件文と後続の `ここまで` がブロック境界をずらしていたため、
`抜ける` を独立行にした複数行条件へ変更した。
- 関数宣言をGo版サンプルに合わせて `とは` で明示し、選択ソート関数と線形探索関数を
それぞれ `ここまで` で閉じた。
- 関数呼び出しと戻り値の代入を同じ文にまとめた。
- 助詞「の」を含む変数名は構文解析で分割されるため、`一時退避のボール数` を
`退避ボール数`、`現在の要素番号` を `現在要素番号` に変更した。宣言、参照、配列添字を
一貫して更新した。
- 既存の配列化、半角演算子・添字、反復表示の `対象キー` 対応は維持した。
コンパイル実行
では、コンパイル実行してみます。
C:\developments\vscode\gonako>gonako run selectsort.nako
整列前
要素番号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ボール数 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5
要素番号0と14を入れ替えました。5 ⇔ 19
要素番号1と13を入れ替えました。6 ⇔ 18
要素番号2と12を入れ替えました。7 ⇔ 17
要素番号3と11を入れ替えました。8 ⇔ 16
要素番号4と10を入れ替えました。9 ⇔ 15
要素番号5と9を入れ替えました。10 ⇔ 14
要素番号6と8を入れ替えました。11 ⇔ 13
整列後
要素番号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ボール数 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
C:\developments\vscode\gonako>
無事に並び変わりました!![]()
おわりに
以上です。いかがでしたでしょうか?なにかの参考になれば幸いです。