日本語プログラミング言語Mindの小技 「多次元配列」～構造体の多次元配列～

# はじめに
日本語プログラミング言語Mindの小技「多次元配列」について説明したいと思います。

# 対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

# この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
１０ 構造体・型紙
└構造体のアクセス
　└多次元配列を実現する場合

>次に、添え字が複数になる場合、つまり、多次元配列状になる場合の表記について説明する。
　まず、先ほどの成績簿を次のように拡張する。
　（成績簿を拡張したもの）
>
>成績簿は　構造体
　　　　　　担任名は　文字列実体　長さ　４０桁
　　　　　　　　　　生徒名は　文字列実体　長さ　４０桁
　　　　　　　　　　数学の成績は　変数
　　　　　　　　　　英語の成績は　変数
　　　　　　　　　　国語の成績は　変数
　　　　　　個人データは
　　　　　　　　生徒名と　数学の成績と　英語の成績と　国語の成績
　　　　クラスデータは
　　　　　　担任名と　３０名分の　個人データ
　　全体は
　　　　４クラス分の　クラスデータである。
>
>上記で分かるように、「個人データは　・・・」の行までは先と同じであり、違うのは、その直後に「クラスデータ」という上位集合を定義した点である。「個人データ」の３０名分の集合として「クラスデータ」という上位集合を定義している。
　上記の拡張版の成績簿では、「生徒名」、「数学の成績」、「英語の成績」、「国語の成績」、「個人データ」が多次元配列のような扱いとなるので、これらの要素の引用では添え字を２つ記述する必要がある。
　例えば、３組の５番の生徒の数学の成績は、
数学の成績（３組、５番）を　数値表示し　・・・
のような引用になる。
　ここで「大きな重みの添え字から並べる」という重要な規則を知っておいて欲しい。これは我々を実社会での、「何年、何組、何番」とか、「○○丁目、○○番地」というように、大きな区分から先に記述するという慣習に合わせたものである。



本機能（本記事）は、下記のバージョンに対応しています。Mind８のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

# 対応バージョン
■Mind７　■Mind８　■Mind９
■Windows版　□Linux版

# 小技の解説
この記事の取り扱う「多次元配列」は構造体の多次元配列です。基底のメンバ変数を単一にすれば通常の変数の多次元配列にもできると思われます。

この記事でのソースコード例は構造体を基底のメンバとした多次元配列の例となります。

# Mindプログラムソース

```mind:galaxy.src
宇宙は　構造体
    銀河フィラメント名は　文字列実体　長さ　５０桁
        超銀河団名は　文字列実体　長さ　２０桁
            銀河団名は　文字列実体　長さ　２０桁
                銀河名は　文字列実体　長さ　２０桁
                    恒星名は　文字列実体　長さ　５０桁
                        惑星名は　文字列実体　長さ　５０桁
                            直径は　　変数
                            衛星数は　変数
                            平均公転半径は　変数
                        惑星データは　
                                惑星名と　直径と　衛星数と　平均公転半径
                    恒星系は　
                        恒星名と　８個の　惑星データ
                銀河系は　
                    銀河名と 　２個の　恒星系   　
            銀河団は　
                銀河団名と　２個の　銀河系
        超銀河団は
            超銀河団名と　２個の　銀河団
    銀河フィラメントは
        銀河フィラメント名と　２個の　超銀河団
全体は　２個の　銀河フィラメント。

暗黒物質は　文字列定数　「　」。

宇宙全体を形成するとは　（・　→　・）
        銀河フィラメント名（１）に　「ヘルクレス座・かんむり座グレートウォール」を　入れ
            超銀河団名（１，１）に　「ラニアケア超銀河団」を　入れ、
                銀河団名（１，１，１）に　「局所銀河団」を　入れ、
                    銀河名（１，１，１，１）に　「天の川銀河」を　入れ、
                        恒星名（１，１，１，１，１）に　「太陽」を　入れ、
                            惑星名（１，１，１，１，１，１）に　「地球」を　入れ、
                                直径（１，１，１，１，１，１）に　１を　入れ、
                                衛星数（１，１，１，１，１，１）に　１を　入れ、
                                平均公転半径（１，１，１，１，１，１）に　１を　入れ、
                            惑星名（１，１，１，１，１，２）に　「木星」を　入れ、
                                直径（１，１，１，１，１，２）に　１１を　入れ、
                                衛星数（１，１，１，１，１，２）に　９７を　入れ、
                                平均公転半径（１，１，１，１，１，２）に　５を　入れ、
                        恒星名（１，１，１，１，２）に　「プロキシマ・ケンタウリ」を　入れ、
                            惑星名（１，１，１，１，２，１）に　「プロキシマ・ケンタウリｂ」を　入れ、
                            惑星名（１，１，１，１，２，２）に　「プロキシマ・ケンタウリｄ」を　入れ、
                    銀河名（１，１，１，２）に　「アンドロメダ銀河」を　入れ、
                銀河団名（１，１，２）に　「うみへび座銀河団」を　入れ、
                    銀河名（１，１，２，１）に　「ＮＧＣ３３０９」を　入れ、
                    銀河名（１，１，２，２）に　「ＮＧＣ３３１２」を　入れ、
            超銀河団名（１，２）に　「おとめ座超銀河団」を　入れ、
                銀河団名（１，２，１）に　「おとめ座銀河団」を　入れ、
                    銀河名（１，２，１，１）に　「ＮＧＣ４４０８」を　入れ、
                    銀河名（１，２，１，２）に　「ＮＧＣ４４８６」を　入れ、
        銀河フィラメント名（２）に　「CfA2グレートウォール」を　入れ
            超銀河団名（２，１）に　「かみのけ座超銀河団」を　入れ、
                銀河団名（２，１，１）に　「かみのけ座銀河団」を　入れ、
                    銀河名（２，１，１，１）に　「ＮＧＣ４８７４」を　入れ、
                    銀河名（２，１，１，２）に　「ＮＧＣ４８８９」を　入れ、
            超銀河団名（２，２）に　「しし座超銀河団」を　入れ、
                銀河団名（２，２，１）に　「しし座銀河団」を　入れ、
                    銀河名（２，２，１，１）に　「ＮＧＣ３６２３」を　入れ、
                    銀河名（２，２，１，２）に　「ＮＧＣ３６２７」を　入れること。

宇宙を観測するとは    　（・　→　・）
        銀河フィラメント番号は　変数
        超銀河番号は　  変数
        銀河団番号は    変数
        銀河番号は　    変数
        恒星系番号は    変数
        惑星番号は      変数

    銀河フィラメント番号を　セットし
    銀河フィラメントの　要素数で　回数指定し
        銀河フィラメント名（銀河フィラメント番号）を　一行表示し
        超銀河番号を　セットし
        超銀河団の　要素数で　回数指定し
            暗黒物質を　表示し　超銀河団名（銀河フィラメント番号，超銀河番号）を　一行表示し
            銀河団番号を　セットし
            銀河団の　要素数で　回数指定し
                ２で　回数指定し　暗黒物質を　表示し　繰り返す　
                銀河団名（銀河フィラメント番号，超銀河番号，銀河団番号）を　一行表示し
                銀河番号を　セットし
                銀河系の　要素数で　回数指定し
                    ３で　回数指定し　暗黒物質を　表示し　繰り返す　
                    銀河名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号）を　一行表示し
                    恒星系番号を　セットし
                    恒星系の　要素数で　回数指定し
                        恒星名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号）が　空列に　等しい文字列？
                        でなければ
                            ４で　回数指定し　暗黒物質を　表示し　繰り返す　
                            恒星名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号）を　一行表示し
                            惑星番号を　セットし
                            ２で　回数指定し
                                ５で　回数指定し　暗黒物質を　表示し　繰り返す　
                                惑星名（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を　表示し
                                「　直径：」を　表示し　
                                直径（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
                                数値表示し
                                「　衛星数：」を　表示し
                                衛星数（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
                                数値表示し
                                「　平均公転半径：」を　表示し　
                                平均公転半径（銀河フィラメント番号，超銀河番号，銀河団番号，銀河番号，恒星系番号，惑星番号）を
                                数値表示し　改行し
                                惑星番号を　一つ増加し
                            繰り返す
                            恒星系番号を　一つ増加し
                        つぎに
                    繰り返す
                    銀河番号を　一つ増加し
                繰り返す
                銀河団番号を　一つ増加し
            繰り返す
            超銀河番号を　一つ増加し
        繰り返す
        銀河フィラメント番号を　一つ増加し
    繰り返す。

メインとは　（・　→　・）
    宇宙全体を形成し
    宇宙を観測すること。
```
本来の単語名の意味からすると要素数のスケールが違い過ぎますが、データの初期化の都合で、極小構成な世界線の異次元ワールドと思っていただければ幸いです:relaxed:

「なになにの　要素数」で回数指定している点に注目いただければ幸いです。
惑星情報のループは、本来は「惑星データの　要素数」で回数指定するところですが、惑星データを初期設定しきれず、とりあえず２つの惑星情報としています。

文字列は空列で、変数は０でランタイムが初期化しています。

# コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。

## Mind９
下図はMind９βです。
```cmd:
C:\developments\vscode\mind9>mind galaxy file   

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> galaxy.exe
```
## Mind8
```cmd:
C:\developments\vscode\mind9>mind galaxy file

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> galaxy.exe
```
## Mind7
```cmd:
C:\developments\vscode\mind9>mind galaxy file
日本語プログラミング言語 Ｍｉｎｄ Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> galaxy.exe
```
# 実行結果
つづいて実行してみます。
Mind7の結果です。記述は割愛していますがMind8/9βも同じです。

```cmd:
C:\developments\vscode\mind9>galaxy
ヘルクレス座・かんむり座グレートウォール
　ラニアケア超銀河団
　　局所銀河団
　　　天の川銀河
　　　　太陽
　　　　　地球　直径：1　衛星数：1　平均公転半径：1
　　　　　木星　直径：11　衛星数：97　平均公転半径：5
　　　　プロキシマ・ケンタウリ
　　　　　プロキシマ・ケンタウリｂ　直径：0　衛星数：0　平均公転半径：0
　　　　　プロキシマ・ケンタウリｄ　直径：0　衛星数：0　平均公転半径：0
　　　アンドロメダ銀河
　　うみへび座銀河団
　　　ＮＧＣ３３０９
　　　ＮＧＣ３３１２
　おとめ座超銀河団
　　おとめ座銀河団
　　　ＮＧＣ４４０８
　　　ＮＧＣ４４８６
　　
　　　
　　　
CfA2グレートウォール
　かみのけ座超銀河団
　　かみのけ座銀河団
　　　ＮＧＣ４８７４
　　　ＮＧＣ４８８９
　　
　　　
　　　
　しし座超銀河団
　　しし座銀河団
　　　ＮＧＣ３６２３
　　　ＮＧＣ３６２７
　　
　　　
　　　

C:\developments\vscode\mind9>
```
遠方の宇宙構造物であるほど、個別の恒星識別は難しいようで、恒星名の情報はみつけにくい感じでした。そのため、惑星データの要素数でループさせると、初期化データで繰り返し表示される回数が多くなってしまうため、惑星情報の繰り返し数は２回としています。


# 参考情報
この小技「多次元配列」を使った記述例の記事はまだないようです。見つけたら教えてください。


# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕４０周年です。

## 本記事シリーズのご紹介
本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕４０周年プロジェクト」の一環です。

興味を持たれた方は[日本語プログラミング言語Mind公式サイト](https://www.scripts-lab.co.jp/mind8download/download.html)にアクセスすると、Mindコンパイラをダウンロードできますよ。

[Mindプログラミングマニュアル（基本文法）](https://www.scripts-lab.co.jp/mind/ver8/doc/index.html)ページから気になるお題の構文を選んで、この記事のようにサンプル実装実行してQiitaにアウトプットしてみましょう！

筆者はMind7/8/9βで検証しておりますが、もちろんMind8だけでもじゅうぶんです。またお題が既存記事とかぶるのはまったく問題ありません。同じお題でみなさまの多様斬新なサンプルをお待ちしております:grinning:

面白い！、楽しい、カンタン、難しいのも書ける！みんなでやってみよう:relaxed: