オープンな設計言語仕様 日本語ロジック仕様記述言語 Re:Mind（リマインド）

# はじめに
日本語ロジック仕様記述言語 Re:Mindは、制御構文の開始シンボルとして、◇、〇、□、・などの全角記号を用い、箇条書きされた日本文としての体裁を[日本語トランスコンパイラ言語 Re:Mind](https://qiita.com/mylifewithviolin/items/9214582528edcbd606ad)の構文と共有しています。

◇は分岐構文、〇はループ構文の開始と終了を表し、冗長な日本語表記がなくてもフロー図の表現に慣れている方が直感的に認識できることを考慮しています。


## この記事内容の作業目的
自作言語Re:Mindの構文仕様策定の一部として、考案した内容をまとめます。

## この記事内容の保証
※この記事には仕様的な情報が含まれます。実装用の自作言語はまだ設計開発中のため、発案者による実装は存在しません。本記事に開示された仕様は次バージョンの仕様においては予告なく変更される場合があります。また、このバージョンの仕様内で補足や追加がなされる場合があります。

# 概要
日本語ロジック仕様記述言語 Re:Mind（リマインド）はオープンな設計言語仕様で、どなたでもこの記法を使いロジックを記述することができます。
また、日本語トランスコンパイラ言語 Re:Mindの下書き原稿として、デベロッパに引き継ぐことで、ロジックの意図の伝達の齟齬を低減することができます。

# 言語仕様
## 変数
```mind:Re:Mind

    ・整数 年齢 = 34

    ・文字列 名前 = "花子"

    ・ブール値 特待区分 = true 
```
□全角文字の中点に続いて、型名を記述し、空白に続いて変数名を記述します。
・型名は一般的なプログラミング言語の半角型名でも可。
・半角等号で初期値を宣言できます。

```mind:Re:Mind
    ・変数 int 年齢

    ・変数文字列 名前

    ・変数bool 特待区分 = true 
```
□全角中点に続いて「変数」と書くこともできます。後述の定数と並んだ時の見栄え、わかりやすさのため、変数宣言であることを明示。

## 定数
```mind:Re:Mind

    ・定数 整数 年齢 = 34

    ・定数文字列 名前 = "花子"

    ・定数ブール値 特待区分 = true 
```
□全角文字の中点に続いて「定数」と書き、続いてターゲット言語の物理型名を半角文字で記述し、半角空白に続いて定数名を記述します。
・型名は一般的なプログラミング言語の半角型名でも可。
・半角等号で初期値を必ず代入します。



## 関数
### 関数の実行
```mind:Re:Mind
    □年齢 = メンバーの年齢を取得する(名前,特待区分)
    □(名前,特待区分)で メンバーの年齢を設定する
```
◇値を返す関数の場合、全角記号の四角□に続いて、戻り値を受け取る変数名を記述し、半角等号に続いて関数名を記述します。
・続いて半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。


◇値を返さない関数の場合、全角記号の四角□に続いて、半角かっこを設け、ターゲット言語の物理型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこで閉じた後、続けて関数名を書くことができます。
半角かっこで閉じた後、続けて「で」や「を」を付加し、半角空白を挟んで関数名を書くこともできます。このひらがなは無視します。

### 値を返す関数の宣言
```mind:Re:Mind

    ▽整数 メンバーの年齢を取得する(文字列 名前,ブール値 区分)
         //todo
        □(齢)を 返す
    △

```
□全角記号の下三角▽が関数宣言の開始となります。
・続いて戻り値型を書きます。戻り値あり関数としては省略不可。
・続いて半角空白をおいて、関数名を書きます。
・続いて半角かっこを設け、型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・型名は一般的なプログラミング言語の半角型名でも可。
・全角記号の上三角△で定義を終了します。
・かならず、定義終了前に全角四角に続き、変数名に空白を挟んで「返す」と記述するとします。


### 値を返さない関数の宣言
```mind:Re:Mind
    ▽メンバーの年齢を設定する(文字列 名前,ブール値 区分)
         //todo
    △
```
□全角記号の下三角▽が関数宣言の開始となります。
・続いて関数名を書きます。
・続いて半角かっこを設け、型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・全角記号の上三角△で定義を終了します。


## クラス
### クラスの宣言
```mind:Re:Mind
　   ▽class メンバーの取り扱い方 : 取り扱い方

        ・変数整数 年齢
        ・変数文字列 名前
        ・変数ブール値 特待区分
    
        ▽整数 メンバーの年齢を取得する(string 名前,bool 区分)
             //todo
            □(齢)を 返す
        △
    
        ▽メンバーの年齢を設定する(string 名前,bool 区分)
             //todo
        △

    △

```
□全角記号の下三角▽がクラス宣言の開始となります。
・続いて半角空白をおいて、classを書きます。ここは全角カタカナで「クラス」と書いても可。
・続いて半角空白をおいて、クラス名を書きます。
・続いて半角空白をおいて、クラス継承表記を書きます。その後は半角空白をおいて、継承元のクラス名を書きます。継承しない場合はこれらの記述は省略可です。
・クラスのメンバの書き方は変数宣言、関数宣言に準じます。
・型名は一般的なプログラミング言語の半角型名でも可。
・全角記号の上三角△で定義を終了します。

### クラスのインスタンス宣言
```mind:Re:Mind

    ・メンバーの取り扱い方 メンバー取り扱い方法 = new()
```
□クラスのインスタンス名は同じ主旨の別名としてください。
・コンストラクタにオーバーロードがある場合は、かっこ内に引数を記述します。

### クラスのインスタンスの変数操作
```mind:Re:Mind
    □年齢 = メンバー取り扱い方法.年齢
    □メンバー取り扱い方法.年齢 = 年齢
```
□クラスのインスタンス名の装飾子は半角ドットです。

### クラスのインスタンスの関数実行
```mind:Re:Mind
    □年齢 = メンバー取り扱い方法.メンバーの年齢を取得する(名前,特待区分)
    □(名前,特待区分)で メンバー取り扱い方法.メンバーの年齢を設定する
```
□クラスのインスタンス名の装飾子は半角ドットです。

◇値を返す関数の場合、全角記号の四角□に続いて、戻り値を受け取る変数名を記述し、半角等号に続いてクラスのインスタンス名と関数名を半角ドットを挟んで記述します。
・続いて半角かっこを設け、型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。


◇値を返さない関数の場合、全角記号の四角□に続いて、半角かっこを設け、型名と変数名を半角空白を挟んで、カンマ区切りで記述し、半角かっこで閉じます。
・半角かっこで閉じた後、続けてクラスのインスタンス名と関数名を半角ドットを挟んで書くことができます。
半角かっこで閉じた後、続けて「で」や「を」を付加し、半角空白を挟んで関数名を書くこともできます。このひらがなは無視します。

## 四則演算、論理演算
・一般的なプログラミング言語のシンタックス（中置記法）に準じます。


## 制御構文
### 分岐

```mind:Re:Mind
    ◇i > 0 の場合
        //todo
    ◇ここまで
```
□全角記号のひし形◇が条件分岐の開始となります。
・続いて論理式を書きます。半角かっこは不要。
・続いて「の場合」と書きます。半角で書かれた論理式とはくっついていても可。
・全角記号のひし形◇が条件分岐の終了となります。
・つづいて「ここまで」と書くことができます。省略も可。

```mind:Re:Mind
    ◇i > 0 の場合
        //todo
    ◇他に i < 0 の場合
        //todo
    ◇他に
        //todo
    ◇ここまで
```
◇途中で最初の論理式とは排他的な条件をつづける場合は、全角ひし形◇に続いて「他に」と書いて、論理式を書いて、「の場合」と書きます。
・論理式の前後の空白は、論理式を半角で書いている場合は省略できます。
◇最後に例外条件を明示する場合は、全角ひし形◇に続いて「他に」と書きます。

```mind:Re:Mind
    ◇i > 0 の場合
        ◇j == 0 の場合
            //todo
        ◇他に
            //todo
        ◇ここまで
        //todo
    ◇他に i < 0 の場合
        //todo
    ◇他に
        //todo
    ◇ここまで
```
□おなじ分岐構文を使って、入れ子で記述することができます。

### 繰り返し


```mind:Re:Mind
    〇i=0,i<10,i++ 繰り返す
        //todo
    〇ここまで
```
□全角記号の丸印〇が繰り返しの開始となります。
・続いてカウンタ論理式をカンマ区切りで書きます。カウンタ変数の型名と半角かっこは不要。
・続いて「繰り返す」と書きます。半角で書かれた論理式とはくっついていても可。
・全角記号の丸印〇が繰り返しの終了となります。
・つづいて「ここまで」と書くことができます。省略も可。
```mind:Re:Mind
    〇繰り返す
        //todo
    〇ここまで
```
□全角記号の丸印〇に続いて「繰り返す」と書いた場合は無限ループになります。
```mind:Re:Mind
    〇繰り返す
        //todo
        ◇j==0 の場合 やめる
        //todo
    〇ここまで
```
・繰り返し構文内で条件分岐文を書いて「やめる」と書くと、直接のループを脱出します。

```mind:Re:Mind
    /** index */
    〇int インデックス=0,インデックス<10,インデックス++ 繰り返す
        //todo
    〇ここまで
```
・繰り返し構文のカウンタ変数をインラインで日本字で宣言することもできます。

```mind:Re:Mind
〇(i<10) の間は繰り返す
        //todo
〇ここまで
```
・while(i<10) のような構文の表記です。

```mind:Re:Mind
〇(i<10) の間は繰り返す
    ◇i<2 の場合
        □ループ先頭へ
        //todo
〇ここまで
```
・条件分岐と合わせて、ループ先頭に制御を移す場合は「ループ先頭へ」を使います。

## コメント
### 通常コメント
```cs:Re:Mind
    //todo
```
□ダブルスラッシュ//で行末までコメントアウトします。
```cs:Re:Mind
/*
    todo
    todo
*/
```
□スラッシュとアスタリスク/*でコメント行開始、アスタリスクとスラッシュ*/でコメント行の終了。


# おわりに
:::note warn
不明な点はコメントで質問していただけるとうれしいです
:::

。

# 参考リンク
https://qiita.com/mylifewithviolin/items/9d58db8a101807c19bde

https://qiita.com/mylifewithviolin/items/9214582528edcbd606ad

https://qiita.com/mylifewithviolin/items/89ac25290d2c684dd5cc

https://qiita.com/mylifewithviolin/items/739d5b792f2f9d4e14fc

https://qiita.com/mylifewithviolin/items/d15fdf16c6a66bdcf5b1