まるで詩のような日本語で書いたプログラム - 最新Mindで動きます

# はじめに

木村 明さん [^1] の傑作かつ芸術的な日本語プログラムに「ポエム（Poem）」があり[^2] まして、2023年に日本語プログラミング言語Mind開発者の@killyさんにより[Qiitaに公開](https://qiita.com/killy/items/0b5eb530fdceebd8c03e)されて好評を博しています。

https://qiita.com/killy/items/0b5eb530fdceebd8c03e

# 経緯
先日、日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン９βをご提供いただいたので、そのグラフィックス機能のお試しを兼ねて上記の記事に公開されているソースをキャンバス機能で動くように調整してみました。

https://qiita.com/mylifewithviolin/items/7200cb5253da32b29b09

こちらはオリジナルのスマイルグラフィックスと異なりラインアート風の「愛ではなくお酒に酔う版」としてお酒に酔う言葉で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α版では、「ＩＤ」や「図形ＩＤ」が導入されていなかったことがわかり、たいへん勉強になりました。

```mind:9801lib.src
※タイトル　9801Lib 旧9801ライブラリ一部再現ライブラリ
※　Version1.0(2023-09-20)
※　片桐　明(2023-09-20) Mind8 新版暫定 向けに作成
※　リンク　filew - guiLib
※　修正：mylifewithviolin(2025-01-18) Mind9(β6) 向けに修正
※　リンク　file - guiLib

※※※※※※※※	色

※　以下は 旧9801ライブラリ: mconsole.src で定義されていたもの　※
黒は　　　　　　　　　　数値　　００Ｈ。
青は　　　　　　　　　　数値　　０１Ｈ。
赤は　　　　　　　　　　数値　　０２Ｈ。
紫は　　　　　　　　　　数値　　０３Ｈ。
緑は　　　　　　　　　　数値　　０４Ｈ。
水は　　　　　　　　　　数値　　０５Ｈ。
黄は　　　　　　　　　　数値　　０６Ｈ。
白は　　　　　　　　　　数値　　０７Ｈ。

※黒色とは　　　　　　　　黒と　　　　　等価。	※これらは新guilibとかぶるので抑制
※青色とは　　　　　　　　青と　　　　　等価。
※赤色とは　　　　　　　　赤と　　　　　等価。
※紫色とは　　　　　　　　紫と　　　　　等価。
※緑色とは　　　　　　　　緑と　　　　　等価。
※水色とは　　　　　　　　水と　　　　　等価。
※黄色とは　　　　　　　　黄と　　　　　等価。
※白色とは　　　　　　　　白と　　　　　等価。


※※※※※※※※	イベント

一つのイベントを処理フックとは　本定義
	一つのイベントを処理すること。


※※※※※※※※	角度などパラメータ

	グローバル。

キャンバス記憶は	ＩＤ。

開始角度は	変数。
終了角度は	変数。

角度設定とは　（開始角、終了角  －－＞  ・）
	開始角度と　終了角度に　入れること。

描画色は	文字列実体　長さ　汎用ＩＤ色定数長さ。

	ローカル。

色番号を色シンボルに変換とは　（番号　→　色シンボル）
	一つ加え
	選択すること
		黒色
		青色
		赤色
		「Violet」	※テスト２
※		赤紫色
		「Green」	※テスト２
※		緑色
		水色
		黄色
		白色
	選択終り
	。

	グローバル。

描画色設定とは　（描画色(番号)　→　・）
	色番号を色シンボルに変換し　描画色に　入れること。


※※※※※※※※	円

中心Ｙ座標は	変数。
中心Ｘ座標は	変数。
円半径は	変数。

	ローカル。

＿円ＩＤは	図形ＩＤ。

	グローバル。

円とは　　　　　（中心Ｙ、中心Ｘ、半径　－－＞　・）
　　　　中心Ｙ座標と　中心Ｘ座標と　円半径に　入れ
	キャンバス記憶と　中心Ｘ座標と　中心Ｙ座標と　円半径で　円のＩＤを取得し　＿円ＩＤに　入れ
	＿円ＩＤを　描画し
	。

円を塗るとは　　（中心Ｙ、中心Ｘ、半径　－－＞　・）
		デバックモードは　数値　０
　　本体とは
　　　　中心Ｙ座標と　中心Ｘ座標と　円半径に　入れ
	デバックモード
		ならば　「円を塗る：」を　表示し　中心Ｙ座標を　数値表示し　空白表示し
			中心Ｘ座標を　数値表示し　空白表示し　「円半径=」を　表示し
			円半径を　数値表示し　「　色=」を　表示し　描画色を　表示し　改行し
		つぎに
	キャンバス記憶と　中心Ｘ座標と　中心Ｙ座標と　円半径で　円のＩＤを取得し　＿円ＩＤに　入れ
	描画色を　＿円ＩＤに　満たす色を設定し
	＿円ＩＤを　描画し
	。

円を消すとは　　（中心Ｙ座標、中心Ｘ座標、半径　－－＞　・）
　　　　＿円ＩＤを　図形を削除する。


※※※※※※※※	円弧

	ローカル。

＿円弧ＩＤは	図形ＩＤ。

	グローバル。

円弧をかくとは　（中心Ｙ座標、中心Ｘ座標、半径　－－＞　・）
		デバックモードは　数値　０
		＿描画角度は　変数
　　　　中心Ｙ座標と　中心Ｘ座標と　円半径に　入れる
	デバックモード
		ならば　「円弧をかく：」を　表示し　中心Ｙ座標を　数値表示し　空白表示し
			中心Ｘ座標を　数値表示し　空白表示し　「円半径=」を　表示し
			円半径を　数値表示し　「　色=」を　表示し　描画色を　表示し
		つぎに
	キャンバス記憶と　中心Ｘ座標と　中心Ｙ座標と　円半径で　円弧のＩＤを取得し　＿円弧ＩＤに　入れ
	　終了角度から　開始角度を　引き　＿描画角度に　入れ
	デバックモード
		ならば　「　描画角度=」を　表示し　＿描画角度を　数値表示し　「 描画色=」を　表示し
			描画色を　表示し　改行し
		つぎに
	開始角度と　＿描画角度を	　＿円弧ＩＤに　開始・描画角度を設定し
	円弧単独で			　＿円弧ＩＤに　円弧の種類を設定
	描画色を　			　＿円弧ＩＤに　線の色を設定し
	２を				　＿円弧ＩＤに　線の太さを設定し
	＿円弧ＩＤを　描画し
	。

円弧を消すとは　　　　　（中心Ｙ座標、中心Ｘ座標、半径　－－＞　・）
　　　　＿円弧ＩＤを　図形を削除する。


※※※※※※※※	初期化

	グローバル。

キャンバスの右下座標は　６４０と　４００。	※9801のディスプレイサイズ

	ローカル。

キャンバスを設置処理とは　（・　→　・）
	※
　　親ＩＤ・サイズ・背景色を積むとは　（・　→　Ｘサイズ、Ｙサイズ）
	メインウィンドウをつみ
	　キャンバスの右下座標をつみ
	　　黒色をつむ
※	　　白色をつむ
	※
　　本体とは
	親ＩＤ・サイズ・背景色を積み　キャンバスを立て　キャンバス記憶に　入れ
	。

	グローバル。

グラフクリアとは　（・　→　・）
	キャンバス記憶を　キャンバスをクリアすること。

グラフ初期化とは　（・　→　・）
	※　グラフィックを初期化する　※
	キャンバスを設置処理し
	グラフクリアし
	。

※　終り　※

```

## 9801lib.srcをMind9β6でビルドしてみる
この移行版の9801lib.srcをMind9β6でビルドしてみます。

```cmd:
C:\developments\vscode\mind9>mind 9801lib guilib

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
```
ビルド成功です！:tada:

# poem3.src
そして下記が最新Mind9（β6）に移行したpoem3.srcの全文です。ほぼオリジナルのままです。「戸惑う」は「５００ミリ　遅延する。」になっています。他は「文字作画」が変数だったのが「図形ＩＤ」に変わった点、図形IDを「有効化」するが「描画」するに変わった点以外は@killyさんのVersion2.0(2023-09-20)とほぼほぼ変わりありません。

```mind:poem3.src
※タイトル　詩によるスマイルフェイス乱数表示プログラム
※　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

夢は　　　　　　　　　　変数と　　　　　等価。
着飾るは　　　　　　　　描画色設定と　　等価。
…は　　　　　　　　　　つぎと　　　　　等価。
眠りとは　　　　　　　　角度設定と　　　等価。
喜劇は　　　　　　　　　回数指定と　　　等価。
酔うは　　　　　　　　　入れると　　　　等価。
タンゴを踊るは　　　　　円を塗ると　　　等価。
ワルツを踊るは　　　　　円弧をかくと　　等価。
グッバイは　　　　　　　割ると　　　　　等価。
言うは　　　　　　　　　引くと　　　　　等価。
おまじないを言うは　　　無処理と　　　　等価。
戸惑うとは　　　　　　　５００ミリ　遅延する。

明日は　５日。
あさっては　１０日。
昨日は　３日。
今日は　０日。

悪夢とは　範囲？と　等価。

きちがい星は　夢。

らんちき騒ぎとは　（・　→　・）
        ※－－－－－－－－－－※
        ※　乱数の種を初期化　※
        ※－－－－－－－－－－※
        日時を得て
　　　　日を　分けて　和む
　　　　きちがい星のうたに　酔う。

☆とは
　　　　生は　夢　　死は　夢　　生と　死に　酔う
　　　　死に　１日を　加え　生を　引き　死に　入れ
　　　　１０１日を　きちがい星に　掛け
　　　　１０００１日間　余を　きちがい星に　酔う
　　　　きちがい星と　死の　余を　生に　加え。

文字作画１は    図形ＩＤ。
文字作画２は    図形ＩＤ。

テキスト描画とは
                オフセットは　　数値　５
                フォントは　　　文字列定数　「{ＭＳＰ 明朝} 12」
                文言１は　　　　文字列定数　「作： 木村　明 (1986)」
                文言２は　　　　文字列定数　「Mind9β + guiLib + 9801Lib」
                テキスト幅１は　数値　２４０
                テキスト幅２は　数値　２４０

　　左上座標は
        オフセットと　オフセット

　　右下座標は
        キャンバスの右下座標を　交換し　オフセットを　引き
        　交換し　オフセットを　引き

　　本体とは
        キャンバス記憶と 文言１を
        　　左上座標で 図形としてテキストのＩＤを取得し　文字作画１に　入れ
        白色を          文字作画１に　文字色を設定し
        フォントを      文字作画１に　フォントを設定し
        テキスト幅１を  文字作画１に　テキストの幅を設定し
        左上隅を        文字作画１に　基準点を設定し
        文字作画１を　描画

        キャンバス記憶と 文言２を
        　　右下座標で 図形としてテキストのＩＤを取得し　文字作画２に　入れ
        白色を          文字作画２に　文字色を設定し
        フォントを      文字作画２に　フォントを設定し
        テキスト幅２を  文字作画２に　テキストの幅を設定し
        右下隅を　      文字作画２に　基準点を設定し
        文字作画２を　描画すること。

扉を開けるとは
        グラフ初期化し
        テキスト描画する。

扉を閉めるとは
        文字作画１を　図形の重なりを最上位へ
        文字作画２を　図形の重なりを最上位へ。

メインは
　　愛は　夢　　恋は　夢　　幸福は　夢　　不幸は　夢
　　　　らんちき騒ぎのあとに
　　　　　　扉を開け
　　　　　　　２８日の　喜劇
　　　　　　　　明日から　３９５日　☆　愛に　酔う
　　　　　　　　　明日から　６３５日　☆　恋に　酔う
　　　　　　　　　　あさってから　７７日　☆　幸福に　酔う
　　　　　　　　　　 １日目から  ７日目まで　☆  着飾って
　　　　　　　　　　 　愛と　恋と  幸福の  タンゴを踊る
　　　　　　　　　　幸福を　２つに　割って　不幸に　入れ
　　　　　　　　　２１０日目から　３３０日目まで　眠る
　　　　　　　　黒を　着飾って
　　　　　　　愛と　恋と　不幸の　ワルツを踊る
　　　　　　愛と　幸福と　昨日に　グッバイと　言って
　　　　　愛に　酔う
　　　　恋が　不幸を　引きよせる
　　　恋に　酔う
　　不幸と　明日に　グッバイして
　 不幸に　酔う
　 愛が  今日から　３９９日間の  悪夢　でなければ　もう一度　…
　 恋が  今日から　６３９日間の  悪夢　ならば
　　愛と　恋と　不幸の　タンゴを踊る　…
　　　恋に　幸福を　加えれば　恋に　酔う
　　　　恋が　今日から　６３９日間の　悪夢　でなければ　もう一度　…
　　　　　愛と　恋と　不幸の　タンゴを踊りつつ　戸惑う
　　　　　　繰り返しくりかえしくりかえし
　　　　　　　扉を閉める。

```

## poem3.srcをMind9β6でビルドしてみる
移行版のpoem3.srcをMind9β6でビルドしてみます。

```cmd:
C:\developments\vscode\mind9>mind poem3 9801lib

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> poem3.exe
```
ビルド成功です！:tada:

## poem3.exeを実行
ついにオリジナルのpoemがWindows11上のMind9で復元しました！:tada::tada:

![mind9betapoem3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/f9fe14cf-4a46-595b-f80b-ea23f23f6260.png)

GIFアニメなので１５秒に収めるためディレイ秒数はオリジナルより若干少な目にしています。

![mind9poem3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/cdcfe934-c5a0-c161-d660-322634823e68.gif)

１回の実行結果をGIFアニメがループして再生していますので、同じパターンが繰り返されていますが、実際は毎回実行するたびに異なるパターンで展開します。

[^1]: 本詩公開当時、MSA（マイクロソフトウェア・アソシエイツ）で日本語プログラミング言語 Mind のプロモーションをしていた方。劇団 SO2 を主宰。

[^2]: Mind活用入門 - Let's日本語プログラミング、相原 寛、学研、1993