220
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

まるで詩のような日本語で書いたプログラム - 実際に動きます

Last updated at Posted at 2023-09-23

はじめに

日本語プログラミングの議論が続いていますが気分転換にこんな奇抜なプログラムはどうでしょうか。

経緯

木村 明さん 1 の傑作かつ芸術的な日本語プログラムに「ポエム(Poem)」があります。
1986年に作られました。当時はPC-9801やFMRなどMS-DOS環境のPCが全盛で、このプログラムもPC-9801向けに書かれていました。プログラムは大変面白いのですが、そのような事情で現在では実際に動かすことはできず長いこと眠っていました。
一方で、Mindのほうは長らく開発していたGUI版が動き始め、Poemが使うグラフィック描画もできるようになったことから、Poem を実際に動かしてみたくなりました。9801グラフィックの互換処理を差し込むことでなんとか動かすことができました。動いたときは「ああ、こんなプログラムだったな」とちょっと感動しました。

公開について

氏の許可を得てソース修正と再公開をします。
Poemは当初フリーソフトとしてBBS、Mindサポート掲示板などにアップされたほか、書籍 2 の付録にも入っていました。実はソースファイルが作者さんにも私のところにも見つからず、書籍の中古をアマゾンで購入し付録の5インチFDから変換しました。

ソースコードと実行画面

ソースプログラム後半の見どころは以下の部分です。

poem.src
~略~

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

ソースプログラムの全体、実行時の静止画・動画は末尾にリンクを張ります。

こんな変てこなソースであってもコンパイルが正しく通るだけでなく、正しい動作・・乱数を引いた座標にスマイルフェイスを次々と表示・・をします。実行時のスクリーンショットはこんな感じです。

解説

からくりを説明します。メイン冒頭の、

愛は 夢  恋は 夢

という部分。実は「夢」はソースプログラム冒頭で以下のように定義された単語です。

夢は 変数と 等価。

したがって先の行は、

愛は 変数  恋は 変数

と書くのと同じです。定義ごとに改行するなら、

愛は 変数
恋は 変数

となります。これならプログラムらしい表現かもしれません。

次に、

らんちき騒ぎのあとに

とあります。「らんちき騒ぎ」は本ソース冒頭で定義された語で乱数の種を初期化するものです。次のように定義されています。

らんちき騒ぎとは
    日時を得て
    日を 分けて 和む
    きちがい星のうたに 酔う。

これも独特の表現なので訳が分かりませんが、乱数の種を初期化するのに日時を使っていることは分かります。

次に、

28日の 喜劇
  ~略~
繰り返しくりかえしくりかえし

の部分。まず「28日」の「日」ですが、助数詞は無視され単なる数値として評価されることを効果的に使っています。
また、「喜劇」は「回数指定」と等価定義なので結局、

28を 回数指定し
  ~略~
繰り返し

と書くのと同じになり、これは繰り返し構文の始まりです。繰り返しブロックの末尾は「繰り返し」ですが、ここではオリジナルの「繰り返し」を使っています。ただ、「繰り返しくりかえしくりかえし」として余韻を残しています。Mindでは送り仮名は最終的に無視されるので、繰り返しくりかえしくりかえし繰り返し と書くのと同じです。

次に、

明日から 395日 ☆ 愛に 酔う

の部分。まず 明日から 395日 ☆ での「明日」は「5」として定義されています。「☆」は処理単語で簡易乱数発生をおこないます。つまり5から395の間の乱数を発生させることになります。
次に、乱数で得た値を 愛に 酔う しています。「愛」は変数名で、「酔う」は「入れる」(代入処理)と等価定義されているので、結局上記は、

5から 395の 乱数を得て 愛に 入れる

と同じ効果となります。

参考情報

ソースファイル Poem.src

Note
Mindのソースファイルの拡張子は src ですが、そのままではブラウザ環境によってはプレーンテキストとして扱われない可能性があるためあえて .txt を末尾に加えました

実行時の動画 - Youtube

  1. 当時、MSA(マイクロソフトウェア・アソシエイツ)で日本語プログラミング言語 Mind のプロモーションをしていた方。劇団 SO2 を主宰。

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

220
85
18

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
220
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?