はじめに
木村 明さん 1 の傑作かつ芸術的な日本語プログラムに「ポエム(Poem)」があり2 まして、2023年に日本語プログラミング言語Mind開発者の@killyさんによりQiitaに公開されて好評を博しています。
経緯
先日、日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン9βをご提供いただいたので、そのグラフィックス機能のお試しを兼ねて上記の記事に公開されているソースをキャンバス機能で動くように調整してみました。
こちらはオリジナルのスマイルグラフィックスと異なりラインアート風の「愛ではなくお酒に酔う版」としてお酒に酔う言葉で9801Libというライブラリ部分を補完しておりました。するとこちらの記事へのコメントで@killyさんより2023年当時の9801Libのソースを現状有姿でご開示いただきましたので、さっそく言語仕様としては固まっているMind9β6に移行させてみました。
話が戻りますが、
もしかしたら非公開の9801libを介せばいけるのかもしれません。
の件、本コメント末尾にソースを入れましたので使ってみていただけますか。
当初はちゃんとした「9801向けMindのグラフィック互換ライブラリ」を作るつもりだったのですが、意外とボリュームが大きいこともあって、思い切って端折り、Poemが使う分だけ定義したものです。
前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6
9801lib.src
下記が最新Mind9(β6)に移行した9801lib.srcの全文です。2023年当時のMind9α版では、「ID」や「図形ID」が導入されていなかったことがわかり、たいへん勉強になりました。
※タイトル 9801Lib 旧9801ライブラリ一部再現ライブラリ
※ Version1.0(2023-09-20)
※ 片桐 明(2023-09-20) Mind8 新版暫定 向けに作成
※ リンク filew - guiLib
※ 修正:mylifewithviolin(2025-01-18) Mind9(β6) 向けに修正
※ リンク file - guiLib
※※※※※※※※ 色
※ 以下は 旧9801ライブラリ: mconsole.src で定義されていたもの ※
黒は 数値 00H。
青は 数値 01H。
赤は 数値 02H。
紫は 数値 03H。
緑は 数値 04H。
水は 数値 05H。
黄は 数値 06H。
白は 数値 07H。
※黒色とは 黒と 等価。 ※これらは新guilibとかぶるので抑制
※青色とは 青と 等価。
※赤色とは 赤と 等価。
※紫色とは 紫と 等価。
※緑色とは 緑と 等価。
※水色とは 水と 等価。
※黄色とは 黄と 等価。
※白色とは 白と 等価。
※※※※※※※※ イベント
一つのイベントを処理フックとは 本定義
一つのイベントを処理すること。
※※※※※※※※ 角度などパラメータ
グローバル。
キャンバス記憶は ID。
開始角度は 変数。
終了角度は 変数。
角度設定とは (開始角、終了角 --> ・)
開始角度と 終了角度に 入れること。
描画色は 文字列実体 長さ 汎用ID色定数長さ。
ローカル。
色番号を色シンボルに変換とは (番号 → 色シンボル)
一つ加え
選択すること
黒色
青色
赤色
「Violet」 ※テスト2
※ 赤紫色
「Green」 ※テスト2
※ 緑色
水色
黄色
白色
選択終り
。
グローバル。
描画色設定とは (描画色(番号) → ・)
色番号を色シンボルに変換し 描画色に 入れること。
※※※※※※※※ 円
中心Y座標は 変数。
中心X座標は 変数。
円半径は 変数。
ローカル。
_円IDは 図形ID。
グローバル。
円とは (中心Y、中心X、半径 --> ・)
中心Y座標と 中心X座標と 円半径に 入れ
キャンバス記憶と 中心X座標と 中心Y座標と 円半径で 円のIDを取得し _円IDに 入れ
_円IDを 描画し
。
円を塗るとは (中心Y、中心X、半径 --> ・)
デバックモードは 数値 0
本体とは
中心Y座標と 中心X座標と 円半径に 入れ
デバックモード
ならば 「円を塗る:」を 表示し 中心Y座標を 数値表示し 空白表示し
中心X座標を 数値表示し 空白表示し 「円半径=」を 表示し
円半径を 数値表示し 「 色=」を 表示し 描画色を 表示し 改行し
つぎに
キャンバス記憶と 中心X座標と 中心Y座標と 円半径で 円のIDを取得し _円IDに 入れ
描画色を _円IDに 満たす色を設定し
_円IDを 描画し
。
円を消すとは (中心Y座標、中心X座標、半径 --> ・)
_円IDを 図形を削除する。
※※※※※※※※ 円弧
ローカル。
_円弧IDは 図形ID。
グローバル。
円弧をかくとは (中心Y座標、中心X座標、半径 --> ・)
デバックモードは 数値 0
_描画角度は 変数
中心Y座標と 中心X座標と 円半径に 入れる
デバックモード
ならば 「円弧をかく:」を 表示し 中心Y座標を 数値表示し 空白表示し
中心X座標を 数値表示し 空白表示し 「円半径=」を 表示し
円半径を 数値表示し 「 色=」を 表示し 描画色を 表示し
つぎに
キャンバス記憶と 中心X座標と 中心Y座標と 円半径で 円弧のIDを取得し _円弧IDに 入れ
終了角度から 開始角度を 引き _描画角度に 入れ
デバックモード
ならば 「 描画角度=」を 表示し _描画角度を 数値表示し 「 描画色=」を 表示し
描画色を 表示し 改行し
つぎに
開始角度と _描画角度を _円弧IDに 開始・描画角度を設定し
円弧単独で _円弧IDに 円弧の種類を設定
描画色を _円弧IDに 線の色を設定し
2を _円弧IDに 線の太さを設定し
_円弧IDを 描画し
。
円弧を消すとは (中心Y座標、中心X座標、半径 --> ・)
_円弧IDを 図形を削除する。
※※※※※※※※ 初期化
グローバル。
キャンバスの右下座標は 640と 400。 ※9801のディスプレイサイズ
ローカル。
キャンバスを設置処理とは (・ → ・)
※
親ID・サイズ・背景色を積むとは (・ → Xサイズ、Yサイズ)
メインウィンドウをつみ
キャンバスの右下座標をつみ
黒色をつむ
※ 白色をつむ
※
本体とは
親ID・サイズ・背景色を積み キャンバスを立て キャンバス記憶に 入れ
。
グローバル。
グラフクリアとは (・ → ・)
キャンバス記憶を キャンバスをクリアすること。
グラフ初期化とは (・ → ・)
※ グラフィックを初期化する ※
キャンバスを設置処理し
グラフクリアし
。
※ 終り ※
9801lib.srcをMind9β6でビルドしてみる
この移行版の9801lib.srcをMind9β6でビルドしてみます。
C:\developments\vscode\mind9>mind 9801lib guilib
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
ビルド成功です!
poem3.src
そして下記が最新Mind9(β6)に移行したpoem3.srcの全文です。ほぼオリジナルのままです。「戸惑う」は「500ミリ 遅延する。」になっています。他は「文字作画」が変数だったのが「図形ID」に変わった点、図形IDを「有効化」するが「描画」するに変わった点以外は@killyさんのVersion2.0(2023-09-20)とほぼほぼ変わりありません。
※タイトル 詩によるスマイルフェイス乱数表示プログラム
※ Version1.0(1986-03-07)
※ リンク ALL
※ 木村 明
※ 修正:片桐 明(2023-09-20) Mind8 新版暫定 向けに修正
※ Version2.0(2023-09-20)
※ リンク filew - guiLib - 9801Lib
※ 修正:mylifewithviolin(2025-01-18) Mind9(β6) 向けに修正
※ Version3.0(2025-01-18)
※ リンク file - guiLib - 9801Lib
夢は 変数と 等価。
着飾るは 描画色設定と 等価。
…は つぎと 等価。
眠りとは 角度設定と 等価。
喜劇は 回数指定と 等価。
酔うは 入れると 等価。
タンゴを踊るは 円を塗ると 等価。
ワルツを踊るは 円弧をかくと 等価。
グッバイは 割ると 等価。
言うは 引くと 等価。
おまじないを言うは 無処理と 等価。
戸惑うとは 500ミリ 遅延する。
明日は 5日。
あさっては 10日。
昨日は 3日。
今日は 0日。
悪夢とは 範囲?と 等価。
きちがい星は 夢。
らんちき騒ぎとは (・ → ・)
※----------※
※ 乱数の種を初期化 ※
※----------※
日時を得て
日を 分けて 和む
きちがい星のうたに 酔う。
☆とは
生は 夢 死は 夢 生と 死に 酔う
死に 1日を 加え 生を 引き 死に 入れ
101日を きちがい星に 掛け
10001日間 余を きちがい星に 酔う
きちがい星と 死の 余を 生に 加え。
文字作画1は 図形ID。
文字作画2は 図形ID。
テキスト描画とは
オフセットは 数値 5
フォントは 文字列定数 「{MSP 明朝} 12」
文言1は 文字列定数 「作: 木村 明 (1986)」
文言2は 文字列定数 「Mind9β + guiLib + 9801Lib」
テキスト幅1は 数値 240
テキスト幅2は 数値 240
左上座標は
オフセットと オフセット
右下座標は
キャンバスの右下座標を 交換し オフセットを 引き
交換し オフセットを 引き
本体とは
キャンバス記憶と 文言1を
左上座標で 図形としてテキストのIDを取得し 文字作画1に 入れ
白色を 文字作画1に 文字色を設定し
フォントを 文字作画1に フォントを設定し
テキスト幅1を 文字作画1に テキストの幅を設定し
左上隅を 文字作画1に 基準点を設定し
文字作画1を 描画
キャンバス記憶と 文言2を
右下座標で 図形としてテキストのIDを取得し 文字作画2に 入れ
白色を 文字作画2に 文字色を設定し
フォントを 文字作画2に フォントを設定し
テキスト幅2を 文字作画2に テキストの幅を設定し
右下隅を 文字作画2に 基準点を設定し
文字作画2を 描画すること。
扉を開けるとは
グラフ初期化し
テキスト描画する。
扉を閉めるとは
文字作画1を 図形の重なりを最上位へ
文字作画2を 図形の重なりを最上位へ。
メインは
愛は 夢 恋は 夢 幸福は 夢 不幸は 夢
らんちき騒ぎのあとに
扉を開け
28日の 喜劇
明日から 395日 ☆ 愛に 酔う
明日から 635日 ☆ 恋に 酔う
あさってから 77日 ☆ 幸福に 酔う
1日目から 7日目まで ☆ 着飾って
愛と 恋と 幸福の タンゴを踊る
幸福を 2つに 割って 不幸に 入れ
210日目から 330日目まで 眠る
黒を 着飾って
愛と 恋と 不幸の ワルツを踊る
愛と 幸福と 昨日に グッバイと 言って
愛に 酔う
恋が 不幸を 引きよせる
恋に 酔う
不幸と 明日に グッバイして
不幸に 酔う
愛が 今日から 399日間の 悪夢 でなければ もう一度 …
恋が 今日から 639日間の 悪夢 ならば
愛と 恋と 不幸の タンゴを踊る …
恋に 幸福を 加えれば 恋に 酔う
恋が 今日から 639日間の 悪夢 でなければ もう一度 …
愛と 恋と 不幸の タンゴを踊りつつ 戸惑う
繰り返しくりかえしくりかえし
扉を閉める。
poem3.srcをMind9β6でビルドしてみる
移行版のpoem3.srcをMind9β6でビルドしてみます。
C:\developments\vscode\mind9>mind poem3 9801lib
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> poem3.exe
ビルド成功です!
poem3.exeを実行
ついにオリジナルのpoemがWindows11上のMind9で復元しました!
GIFアニメなので15秒に収めるためディレイ秒数はオリジナルより若干少な目にしています。
1回の実行結果をGIFアニメがループして再生していますので、同じパターンが繰り返されていますが、実際は毎回実行するたびに異なるパターンで展開します。