はじめに
日本語プログラミング言語Mindの小技「局所処理単語」について説明したいと思います。
「局所処理単語」とは「クロージャ」みたいな感じものです。その点においてMindはJavaScriptやJava8の登場をまたずにそれよりはるか以前にクロージャ(っぽいの)を実装していた言語のひとつとなります。1
対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方
この小技に関連するMind言語マニュアル
この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
2 プログラム表記の基本
└局所処理単語
処理単語の定義の内部に小さな処理単語を定義できる。親となる処理単語のためだけの下位処理(子の処理)を定義する時に利用する。
親・子関係が視覚的に理解しやすいことのほか、局所処理単語はその親以外からは「見えない」ため、子の処理を(関係のない)外部から隠蔽する働きもありプログラムがより強固になる。
また、親から見て下位となる子の処理単語を普通に「外」で定義することに比べると、子から親の局所変数を自由にアクセスできるメリットもある。
構文=
処理1とは
( ○○は 変数 ) ←局所変数群(もし有れば)
( ○○は 変数 )
下位処理1とは ←局所処理単語
・・・・・・・・
下位処理2とは ←局所処理単語
・・・・・・・・
本体とは ←本来の親の単語定義はここから
・・・・・・・・
・・・・・・・・すること。
局所処理単語を含めた処理単語定義の例を上に示した。この例では「局所処理1」「局所処理2」という2 つの単語が局所処理単語である。次のような注意がある。
~略~
本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。その意味でノーチェックですので、対応していないという意味ではありません。また、この機能はMind7よりも古いバージョンからサポートされています。筆者の知る限りでは遅くとも5.2には対応されていたと思われます。このあたりは古いユーザーさんが恐らく補足してくれるでしょう。1
対応バージョン
■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版
小技の解説
冒頭でもご説明しましたが「局所処理単語」はMindの単語定義内で、その単語内で使用可能な単語を定義する機能です。
エンクロージャのような親単語内で定義されたローカル変数にもちろんアクセスできます。クロージャと異なるのは、Mindの引数はスタックで渡されますので、この点公式マニュアルでも注意事項が書かれていますが、単語内の変数に(よっては)アクセスする際に若干の注意が必要です。
具体的なサンプルコードを使って説明します。
Mindプログラムソース
局所処理単語のサンプルを実行とは
サンプル単語内の文字列変数は 文字列変数
サンプル単語内の変数は 変数
この単語内の文字列変数を表示するとは
サンプル単語内の文字列変数を 一行表示すること
この単語内の変数を表示するとは
サンプル単語内の変数を 数値表示すること
本体とは
「これはクロージャぽい機能のサンプルですよ」を
サンプル単語内の文字列変数に 入れ
12345を サンプル単語内の変数に 入れ
この単語内の文字列変数を表示し
この単語内の変数を表示すること。
メインは
局所処理単語のサンプルを実行します。
「サンプル単語内の文字列変数」という文字列変数と「サンプル単語内の変数」という変数は「局所処理単語のサンプルを実行」という単語内のローカル変数で、その値のセットは普通に「局所処理単語のサンプルを実行」という単語内で行っています。
「本体とは」の下の3行がそれに該当します。
そして、「局所処理単語のサンプルを実行」という単語内の「本体とは」の上には「この単語内の文字列変数を表示」という単語と「この単語内の変数を表示」という単語が定義されておりまして、その単語内でそれぞれ「サンプル単語内の文字列変数」という文字列変数と「サンプル単語内の変数」という変数にアクセスして表示処理を行っていることがおわかりでしょうか。
これってクロージャじゃん!と思っていただければ幸いです。Mindは実に40年近く前からのこの仕様を実装していました。実際いつから搭載したかは@killyさんじゃないとわからない!?
コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。
Mind9
下図はMind9βです。
C:\developments\vscode\mind9>mind closureTango file
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> closureTango.exe
Mind8
C:\developments\vscode\mind9>mind closureTango file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> closureTango.exe
Mind7
C:\developments\vscode\mind9>mind closureTango file
日本語プログラミング言語 Mind 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
実行結果
つづいて実行してみます。Mind9βの結果です。記述は割愛していますがMind7/8も同じです。
C:\developments\vscode\mind9>closureTango
これはクロージャぽい機能のサンプルですよ
12345
C:\developments\vscode\mind9>
参考情報
クロージャについての一般参考情報です。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕40周年です。