まるで詩のような日本語で書いたプログラム（愛ではなくお酒に酔う版） - Mind９βで動かしてみた

# はじめに

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

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

# 経緯
おととしとなりますが、本体ソースコードは完全な形で公開されていますので、動かしてみようかなと思いましたところ、Mindのグラフィックス機能はMind9まで公開されていないのでそのままではだいぶビルドエラーがでてしまいました。そこで、現状のMind8の標準ライブラリで動くよう、氏[^1] の傑作詩の本文はそのままに、ビハインドの処理単語定義を調整してみましたのが下記のバージョンでした。ただし、こちらの実行結果はいまひとつ残念な感じにとどまっておりました。

https://qiita.com/mylifewithviolin/items/064109f9e81c7d048f86

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

# 前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6　

# オリジナルのpoem.srcをMind9β6でビルドしてみる
念のため、オリジナルのpoem.srcをMind9β6でビルドしてみました。Mind9βで追加されたguilibを強引にリンクします。こちらは想定どおり相応の数のビルドエラーで出ます。あくまで参考実行です。もしかしたら非公開の9801libを介せばいけるのかもしれません。

```cmd:
C:\developments\vscode\mind9>mind poem guilib  

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
20 個のエラーが有ります。
```

## Mind8コンソール版のpoem2.srcをMind9β6でビルドしてみる
つづいて Mind8コンソール版のpoem2.srcをMind9β6でビルドしてみました。まずは従来どおりfileライブラリとのリンクの場合です。
```cmd:
C:\developments\vscode\mind9>mind poem2 file  

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> poem2.exe
```
こちらは問題なくビルド通過しました。続いて、念のため今回のお試しターゲットのguilibをリンクします。下位互換でFileライブラリしか使用していないので、ビルドは通過する想定でした。

```cmd:
C:\developments\vscode\mind9>mind poem2 guilib 

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
2 個のエラーが有ります。
```
おおっエラーが出てしまいました。どこだろうとpoem2.infを開いてみますと．．．
```mind:poem2.inf
poem2.src 17 行目でエラー。行内容は、
図形の重なりを最上位へとは	無処理。
      要因１："図形の重なりを最上位"は重複定義です（guilibで定義済み）。

poem2.src 77 行目でエラー。行内容は、
戸惑うとは　　　　　　　３　十ミリ秒単位待すること。
      要因１："十ミリ秒単位待"は未定義の単語です。

2 個のエラーが有ります。
```
１点目はなっとくでなるほどなのですが、２点目はちょっと意外でした。ctimerに定義されている下記の処理待ち単語に変更してみても同様でしたので、今回はディレイ単語は未使用です。

```mind:ctimer.src
百ミリ秒待ちとは　　１だけ　百ミリ秒単位待つこと。
一秒待つとは　　　１０だけ　百ミリ秒単位待つこと。
```

# キャンバス版のpoem4.srcをMind9β6でビルドしてみる
Mind9のグラフィックス機能のキャンバスを試しに実装したpoem4.srcをMind9β6でビルドしてみました。poem3.srcで書いていましたが諸般の事情でpoem4.srcとなっております。コードは追ってご説明いたします。

```cmd:
C:\developments\vscode\mind9>mind poem4 guilib  

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindexw.exe --> poem4.exe
```
poem4.src無事にビルド通過しました。では続いて実行してみます。

# キャンバス版のpoem4.srcを実行
諸般の事情で下図のようなモノクロラインアート風の雰囲気になってしまいました。ディレイはかからないので一瞬で描画されます。

![mind9beta2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/4046bb9a-fbc9-b81b-0c0e-c36769ef16cc.png)

# 解説
「円を塗る」と「円弧をかく」は下記のように記述しました。

```mind:poem4.src
円を塗るとは
		＿円ＩＤは	希望
        ビールは　夢
        日本酒は　夢
        ウィスキーは　夢
    
    日本酒に　酔う
    ビールに　酔う
    ウィスキーに　酔う

    ビールを　９００本　買って来て　ビールに　酔う
    日本酒を　１０杯　掛けて　４８０本　買って来て　日本酒に　酔う
    ２杯ほど　ウィスキーに　酔う
    
    御つまみと　ビールと 日本酒と ウィスキーで　円のＩＤを取得し　＿円ＩＤに　入れ
	白色を　	＿円ＩＤに　満たす色を設定し
	＿円ＩＤを　描画すること。


円弧をかくとは
		＿円弧ＩＤは	希望
        チューハイは　夢
        ハイボールは　夢
        ワインは　夢

    チューハイに　酔う
    ハイボールに　酔う
    ワインに　酔う

    チューハイを　８００本　買って来て　４００本　加えて　チューハイに　酔う
    ハイボールを　４００本　買って来て　ハイボールに　酔う
    ５杯ほど　ワインに　酔う

	御つまみと　ワインと ハイボールと チューハイで　円弧のＩＤを取得し　＿円弧ＩＤに　入れ
    0と　359で		＿円弧ＩＤに　開始・描画角度を設定し
	円弧単独で		＿円弧ＩＤに　円弧の種類を設定
    白色を　＿円弧ＩＤに　線の色を設定し
	＿円弧ＩＤを　描画すること。
```
一部の単語はMind9のグラフィックス単語のままですが、「希望」と「御つまみ」は下記の定義となっております。「御つまみ」はサンプルコードでは「キャンバス」とされている場合が多いようです。

```mind:poem4.src
希望は　　　図形ＩＤと　　　等価。
御つまみは　ＩＤ。
```

円弧は円の着色無の線色ありでも描けるのかもしれませんが、まだよくわかっておりません。


# おわりに
いかがでしたでしょうか？まだほんのさわりの部分ですが、今年で生誕４０周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます！

## 参考情報
<details><summary>ソースコード全文</summary>

```mind:poem4.src
※タイトル　詩によるスマイルフェイス乱数表示プログラム
※　Version1.0(1986-03-07)
※　リンク　ALL
※　木村　明
※　修正：片桐　明(2023-09-20) Mind8 新版暫定 向けに修正
※　リンク　filew - guiLib - 9801Lib
※　修正：@mylifewithviolin(2023-11-23) Mind8向けに修正 スマイルフェイス->●〇
※　リンク　filew 
※　修正：@mylifewithviolin(2025-01-11) Mind9β向けに修正
※　リンク　filew - guiLib 

夢は　　　　　　　　　　変数と　　　　　等価。
酔うは　　　　　　　　　入れると　　　　等価。
喜劇は　　　　　　　　　回数指定と　　　等価。
希望は　　　　　　　　　図形ＩＤと　　　等価。

御つまみは　ＩＤ。

※図形の重なりを最上位へとは	無処理。Mind9βguilibで定義済
黒とは				無処理。
買って来るとは　	割った余りと　	等価。　　

テキスト描画とは
                文言１は　　　　文字列定数　「原詩作： 木村　明 (1986)」
                文言２は　　　　文字列定数　「Mind9(β6) + guiLib(β6)」
                ＿テキストＩＤは	希望
                明朝２０は　　文字列定数　「{ＭＳＰ 明朝} 10」

	御つまみと　文言１を　700 10で　図形としてテキストのＩＤを取得し	＿テキストＩＤに　入れ
	白色を		＿テキストＩＤに　文字色を設定し
	明朝２０を	＿テキストＩＤに　フォントを設定し
	＿テキストＩＤを　描画し
	御つまみと 　文言２を 700 30で 図形としてテキストのＩＤを取得し　＿テキストＩＤに　入れ
	白色を		＿テキストＩＤに　文字色を設定し
	明朝２０を	＿テキストＩＤに　フォントを設定し
	＿テキストＩＤを　描画すること。

円を塗るとは
		＿円ＩＤは	希望
        ビールは　夢
        日本酒は　夢
        ウィスキーは　夢
    
    日本酒に　酔う
    ビールに　酔う
    ウィスキーに　酔う

    ビールを　９００本　買って来て　ビールに　酔う
    日本酒を　１０杯　掛けて　４８０本　買って来て　日本酒に　酔う
    ２杯ほど　ウィスキーに　酔う
    
    御つまみと　ビールと 日本酒と ウィスキーで　円のＩＤを取得し　＿円ＩＤに　入れ
	白色を　	＿円ＩＤに　満たす色を設定し
	＿円ＩＤを　描画すること。


円弧をかくとは
		＿円弧ＩＤは	希望
        チューハイは　夢
        ハイボールは　夢
        ワインは　夢

    チューハイに　酔う
    ハイボールに　酔う
    ワインに　酔う

    チューハイを　８００本　買って来て　４００本　加えて　チューハイに　酔う
    ハイボールを　４００本　買って来て　ハイボールに　酔う
    ５杯ほど　ワインに　酔う

	御つまみと　ワインと ハイボールと チューハイで　円弧のＩＤを取得し　＿円弧ＩＤに　入れ
    0と　359で		＿円弧ＩＤに　開始・描画角度を設定し
	円弧単独で		＿円弧ＩＤに　円弧の種類を設定
    白色を　＿円弧ＩＤに　線の色を設定し
	＿円弧ＩＤを　描画すること。


着飾るは　　          捨てると　　　　等価。　　　※描画色設定と　　等価。
…は　　　　　　　　　　つぎと　　　　　等価。
眠りとは　　　　　　　　捨てると　　　　等価。    ※角度設定と　　　等価。


タンゴを踊るは　　　　　円を塗ると　　　等価。
ワルツを踊るは　　　　　円弧をかくと　　等価。
グッバイは　　　　　　　割ると　　　　　等価。
言うは　　　　　　　　　引くと　　　　　等価。
おまじないを言うは　　　無処理と　　　　等価。
戸惑うとは　　　　　　　８０ミリで　　　遅延。　※guilibリンクすると："十ミリ秒単位待"は未定義の単語です。filewはＯＫ
弄ぶとは　　　　　　　　捨てると　　　　　等価。

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

悪夢とは　範囲？と　等価。

くるった星は　夢。

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

☆とは
　　　　生は　夢　　死は　夢　　生と　死に　酔う
　　　　死に　１日を　加え　生を　引き　死に　入れ
　　　　１０１日を　くるった星に　掛け
　　　　１０００１日間　余を　くるった星に　酔う
　　　　くるった星と　死の　余を　生に　加え。

※文字作画１は    変数。
※文字作画２は    変数。


扉を開けるとは
　　　　メインウィンドウと　800と　480と　黒色で
　　　　　　　　　　　　　　キャンバスを立て　御つまみに　入れ
        テキスト描画する。

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

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

# 追記

開発元の@killyさんよりguilibリンクした場合はCUI用の「待つ」系単語は未定義となりGUI用の「遅延」のご案内をいただきましたので、下記のヶ所「無処理」から「８０ミリで　　　遅延」に書き換えてみました。

```mind:poem4.src
戸惑うとは　　　　　　　８０ミリで　　　遅延。　※guilibリンクすると："十ミリ秒単位待"は未定義の単語です。filewはＯＫ
```

## 遅延版のpoem4.srcを実行
上記の「戸惑う」ありの場合の実行状態です。

![poem4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/568b606c-c986-3094-488d-94306a42b114.gif)


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

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