はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン9βをご提供いただいたので、前回の記事では9βの言語拡張機能「評価」でTcl乱数関数を定義してみましたところ@killyさんからよりMind9らしい書き方をご教授いただいたので本記事でそれを試してみました。本記事はマニュアル未記載な内容でMind9の本来のサポートレベルを超えた内容です。
前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6
9βの言語拡張機能「評価」とは
guilibに「評価」「評価した値」は定義されています。マニュアル非公開なのですが
<Tcl/Tkスクリプト>を 評価する → ・
<Tcl/Tkスクリプト>を 評価した値 → 値(文字列)
というスタック仕様です。お試しください。
そして、前回記事ではMind7の記法を倣って書いていたのですが、Mind9ではこう書いてくださいというサジェストをいただきました。
実験していただいたソースでは動的に文字列実体変数を獲得するとかされておられ、確かにMind7ではそのようにしている箇所が多かったのですが、Mind9では次の便利な単語群が定義されているのでご利用ください。(動的確保ではないので、2048桁を超える長さのスクリプトは扱えません)
「command」を コマンドラインにトークンを設定し
「abc」を コマンドラインに空白とトークンを追加し
「def ghi」を コマンドラインに空白と囲みトークンを追加し
123を コマンドラインに空白と数値トークンを追加し
コマンドラインを 評価する
生成されるコマンドライン
→ command abc {def ghi} 123
今回はこちらの記法で書いてみます。また、テスト用のコードとソースコードファイルを分離します。
お題のソースコード
ライブラリ
疑似乱数とは 関数 小数出力 (・ → 小数)
※ 0.0以上~1.0未満 の 乱数を戻す
「expr { rand() }」を コマンドラインにトークンを設定し
コマンドラインを 評価した値を 数値変換・小数として
捨てる。
種子指定の疑似乱数とは 関数 整数入力 小数出力 (変数 → 小数)
※ シード値指定の0.0以上~1.0未満 の 乱数を戻す
種子は 変数
種子に 入れ
「expr { srand(」を コマンドラインにトークンを設定し
種子を 文字列変換し コマンドラインにトークンを追加し
「)}」を コマンドラインにトークンを追加し
コマンドラインを 評価した値を 数値変換・小数として
捨てる。
テスト用コード
"randomtcl.src"を コンパイルする。
キャンバスは ID。
キャンパス幅は 定数 800。
キャンパス高は 定数 400。
簡易小数表示とは (小数、変数 → ・)
_テキストIDは 図形ID
明朝10は 文字列定数 「{MSP 明朝} 10」
数字文字は 文字列
Y座標は 変数
Y座標に 入れ
5桁と 4桁で 文字列変換・小数形式し 数字文字に 入れ
キャンバスと 数字文字を 300 Y座標で 図形としてテキストのIDを取得し _テキストIDに 入れ
赤色を _テキストIDに 文字色を設定し
明朝10を _テキストIDに フォントを設定し
_テキストIDを 描画すること。
※ テスト用
メインとは
メインウィンドウと キャンパス幅と キャンパス高と 白色で
キャンバスを立て キャンバスに 入れ
疑似乱数()を 10で 簡易小数表示し
疑似乱数()を 20で 簡易小数表示し
種子指定の疑似乱数(10)を 30で 簡易小数表示し
種子指定の疑似乱数(10)を 40で 簡易小数表示し
種子指定の疑似乱数(30)を 50で 簡易小数表示すること。
お題のソースコードのMind9βでのビルド
C:\developments\vscode\mind9>mind randomtcl2 guilib
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> randomtcl2.exe
お題のMind9βでの実行の様子
無事に動作しました。なんどか繰り返すと異なる値となることがわかります。
3行目と4行目は同じシード値による乱数です。
本件引き続き深堀して参ります。こちらに記載の
[使用例2]に対応した関数を用意したいと考えております。
% expr rand() * 100 ---(1)
75.90084829176816
% expr rand() * (5-2)+2 ---(2)
2.5687755898427103
% set x [expr rand() * 100] ---(3)
28.997123674022557
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕40周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます!
参考
Tclのexprの下記の表記は下記のリンク先の情報からこのようにしております。
expr { rand() }