日本語プログラミング言語Mindの小技 「局所処理単語」～クロージャっぽい～

# はじめに
日本語プログラミング言語Mindの小技「局所処理単語」について説明したいと思います。

「局所処理単語」とは「クロージャ」みたいな感じものです。その点においてMindはJavaScriptやJava8の登場をまたずにそれよりはるか以前にクロージャ(っぽいの)を実装していた言語のひとつとなります。[^1]


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

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

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
２ プログラム表記の基本
└局所処理単語

>　処理単語の定義の内部に小さな処理単語を定義できる。親となる処理単語のためだけの下位処理（子の処理）を定義する時に利用する。
　親・子関係が視覚的に理解しやすいことのほか、局所処理単語はその親以外からは「見えない」ため、子の処理を（関係のない）外部から隠蔽する働きもありプログラムがより強固になる。
　また、親から見て下位となる子の処理単語を普通に「外」で定義することに比べると、子から親の局所変数を自由にアクセスできるメリットもある。


>構文＝
処理１とは
　　　　　　（　○○は　　変数　）　　←局所変数群（もし有れば）
　　　　　　（　○○は　　変数　）
　下位処理１とは　　　　　　　　←局所処理単語
　　　　・・・・・・・・
　下位処理２とは　　　　　　　　←局所処理単語
　　　　・・・・・・・・
　本体とは　　　　　　　　　　　←本来の親の単語定義はここから
　　　　・・・・・・・・
　　　　・・・・・・・・すること。


>　局所処理単語を含めた処理単語定義の例を上に示した。この例では「局所処理１」「局所処理２」という２ つの単語が局所処理単語である。次のような注意がある。
～略～


本機能（本記事）は、下記のバージョンに対応しています。Mind８のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。その意味でノーチェックですので、対応していないという意味ではありません。また、この機能はMind7よりも古いバージョンからサポートされています。筆者の知る限りでは遅くとも5.2には対応されていたと思われます。このあたりは古いユーザーさんが恐らく補足してくれるでしょう。[^1]

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

# 小技の解説
冒頭でもご説明しましたが「局所処理単語」はMindの単語定義内で、その単語内で使用可能な単語を定義する機能です。

エンクロージャのような親単語内で定義されたローカル変数にもちろんアクセスできます。クロージャと異なるのは、Mindの引数はスタックで渡されますので、この点公式マニュアルでも注意事項が書かれていますが、単語内の変数に（よっては）アクセスする際に若干の注意が必要です。

具体的なサンプルコードを使って説明します。

# Mindプログラムソース

```mind:closureTango.src
局所処理単語のサンプルを実行とは
    サンプル単語内の文字列変数は　文字列変数
    サンプル単語内の変数は　変数

    この単語内の文字列変数を表示するとは
        サンプル単語内の文字列変数を　一行表示すること
        
    この単語内の変数を表示するとは
        サンプル単語内の変数を　数値表示すること

本体とは
    「これはクロージャぽい機能のサンプルですよ」を　
                        サンプル単語内の文字列変数に　入れ
    １２３４５を　サンプル単語内の変数に　入れ
    この単語内の文字列変数を表示し
    この単語内の変数を表示すること。  

メインは　　
    局所処理単語のサンプルを実行します。

```

「サンプル単語内の文字列変数」という文字列変数と「サンプル単語内の変数」という変数は「局所処理単語のサンプルを実行」という単語内のローカル変数で、その値のセットは普通に「局所処理単語のサンプルを実行」という単語内で行っています。
「本体とは」の下の３行がそれに該当します。

そして、「局所処理単語のサンプルを実行」という単語内の「本体とは」の上には「この単語内の文字列変数を表示」という単語と「この単語内の変数を表示」という単語が定義されておりまして、その単語内でそれぞれ「サンプル単語内の文字列変数」という文字列変数と「サンプル単語内の変数」という変数にアクセスして表示処理を行っていることがおわかりでしょうか。

これってクロージャじゃん！と思っていただければ幸いです。Mindは実に４０年近く前からのこの仕様を実装していました。実際いつから搭載したかは@killyさんじゃないとわからない！？:grin:

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

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

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

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

```cmd:
C:\developments\vscode\mind9>closureTango
これはクロージャぽい機能のサンプルですよ
12345
C:\developments\vscode\mind9>
```

# 参考情報
クロージャについての一般参考情報です。

https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3

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

[^1]:開発者@killyさんの本記事コメントのソースコードコメント調査によれば1989年ごろより実装の痕跡ありとのこと。正式リリース版対応としてはMind7(1997年)より。