日本語プログラミング言語Mindの小技 「逆転介入」～計算式日本語表現の語順への逆転介入～

# はじめに
日本語プログラミング言語Mindの小技「演算順へのひらがな助詞の逆転介入」について説明したいと思います。

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

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

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
６ 数値演算
└データの逆転介入

>２つのデータを受け取り、しかも、そのデータの順番が意味を持つような処理単語を書いた場合、コンパイラによるデータの逆転介入が行われることを承知して欲しい。
　例えば、
　　　　５から　２を　引く　　　‥‥‥①
　と書く場合だが、このデータを逆に記述して、
　　　　２を　５から　引く　　　‥‥‥②
　としても（日本語として同じ意味であるように）正常に演算が行われる。これは、コンパイラが、データの逆順記述をその助詞の使い方から自動判断し、２つのデータを逆転してから処理するというサービスを行うからである。

>コンパイラはまず、助詞を次のようにグループ分けする。
表6-1　コンパイル時の助詞の優先値      
優先値	　助詞
　１　	　が、 は　
　２　	　から、 より　
　３　	　を　
　４　	　よりも、 で、 だけ、 による、 により、 での、 との　
　５　	　に、 へ、 と　

>　２つのデータの助詞を次のように表したたとき、次の条件を満足した場合に逆転介入を行うようになっている。
データ１+助詞1　データ２+助詞2　［処理単語］　→　？
　　　　　　　　　　　　↓
　　　　　以下の条件を満たした時に逆転介入をおこなう
　　　　　助詞1の優先値 ＞ 助詞2の優先値

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

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

# 小技の解説
他の日本語プログラミング言語に比べて、ひらがなの扱いが比較的緩めでありますMindでの、一部のひらがな助詞に対して語順の違いと作用内容の違いを吸収する仕様にまつわるお話です。

基本的に逆ポーランド記法といいますか、スタックに変数や値をのせた順で処理されていくことに対して例外がありますよというお話です。

マニュアルでは引き算を例として解説していますが、この記事では少しひねった例で表６にでてくる助詞の扱いに関してMindコンパイラの挙動を探ってまいります。

# Mindプログラムソース

```mind:gyakuten.src
計算処理時に助詞ひらがなによる値語順へ介入するとは　（・　→　・）
        結果は　変数
    「通常の式表現」を　一行表示する
    [結果　：＝　１０　－　７]　結果を　数値表示し　改行する
    １０から　７を　引き　数値表示し　改行する

    「"を"　より優先度１高」を　一行表示する
    ７を　　１０から　引き　数値表示し　改行する
    ７を　　１０より　引き　数値表示し　改行する

    「"を"　より優先度１低」を　一行表示する
    ７よりも　１０を　引き　数値表示し　改行する
    ７で　１０を　引き　数値表示し　改行する
    ７だけ 　１０を　引き　数値表示し　改行する
    ７による 　１０を　引き　数値表示し　改行する
    ７により 　１０を　引き　数値表示し　改行する
    ７での　１０を　引き　数値表示し　改行する
    ７との　１０を　引き　数値表示し　改行する
    
    「"を"　より優先度２低」を　一行表示する
    ７に　１０を　引き　数値表示し　改行する
    ７へ　１０を　引き　数値表示し　改行する
    ７と　１０を　引き　数値表示し　改行する
    
    「"から"　より優先度１高」を　一行表示する
    ７から　１０が　引き　数値表示し　改行する
    
    「"を"　より優先度２高」を　一行表示する
    ７を　　１０が　引き　数値表示し　改行する
    ※７を　１０は　引き　数値表示し　改行する
    。

メインとは　（・　→　・）
    計算処理時に助詞ひらがなによる値語順へ介入すること。
```

最初の「通常の式表現」の下２行はまさに通常の順序の表現の結果です。
それより下からが助詞による作用順序の逆転が起きている例です。

ここでは通常の日本語表現らしさを無視して、コンパイラの助詞の相対的優先度の判定がどのように行われるかを検証するため
「"を"　より優先度１高」表６の中で「を」の直上すなわち優先度２との関係
「"を"　より優先度１低」表６の中で「を」の直下すなわち優先度４との関係
「"を"　より優先度２低」表６の中で「を」の２つ下すなわち優先度５との関係

「"から"　より優先度１高」表６の中で優先度２と優先度１との関係
「"を"　より優先度２高」表６の中で「を」の２つ上すなわち優先度１との関係
について比較実行しています。

結果をわかりやすくするため、基本的に同じ引き算に対していろいろな助詞を使っていますが、いろいろな優先度の助詞が引き算以外の場合にも日本語的にマッチするように用意されていますので、マッチしたものを記述すれば不自然さはさほど問題にはなりません。

最後のコメントアウト行は優先度１の「は」は定義文助詞としてかなりつよい位置にあるため、計算式内での使用はのちに説明しますがコンパイルエラーとなります。

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

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

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

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

```cmd:
C:\developments\vscode\mind9>gyakuten
通常の式表現
3
3
"を"　より優先度１高
3
3
"を"　より優先度１低
3
3
3
3
3
3
3
"を"　より優先度２低
3
3
-3
"から"　より優先度１高
3
"を"　より優先度２高
3

```
「と」は「を」に対して逆転介入されませんでした。
また「は」は「が」と同じ優先度１でも、単語定義助詞として別格のため、式表現の逆転操作には使えないようでした。強引に使うと下記のようなコンパイルエラーとなります。

```
gyakuten.src 27 行目でエラー。行内容は、
    ７を　１０は　引き　数値表示し　改行する
      要因１：この位置では局所変数や局所処理単語は定義できません。
      要因２：この位置では局所処理単語は定義できません。
      要因３：数値または文字列を単語名として定義しようとしています。

3 個のエラーが有ります。
```

# 参考情報
この小技「計算式の日本語表現の語順の逆転」を使った記述例の記事はいろいろありそうです。なにげなく使われている場合が多いです。


# おわりに
いかがでしたでしょうか？ちょっとマニアックな内容でしたが、なにかの参考になれば幸いです。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: