麻雀牌言語を Forth で作ろう

無事、Linq2Twitter で絵文字が出たところで、麻雀牌言語に取り組んでいます。ユニコードには麻雀牌の領域があって、麻雀牌 – Wikipedia http://ja.wikipedia.org/wiki/%E9%BA%BB%E9%9B%80%E7%89%8C を見ると、U+1F000 – U+1F02B が割り当てられています。

な感じで表示ができます(残念ながら、Mac/iPhone の場合はフォントがないらしく豆腐になりますが)。

■言語仕様は Forth

Tiny Forthインタープリタ
http://middleriver.chagasi.com/electronics/tforth.html

Forth 言語をご存じでしょうか?実際使ったことはないのですが、Cマガジンにスタックマシン言語として、スタックを最大に利用した(レジスタを使わない)方式のプログラミング言語です。確か、逆ポーランド法の解説だったかコンパイラの解説だったかで出た記事だったと思います。CPU の高速なレジスタに直接アクセスする代わりに、スタックに積んで計算するというちょっと回りくどいのですが、アセンブリ的に覚えやすくて実装しやすいという利点がある、ってことだけ覚えています。

実際、先のリンクをたどると tiny forth が C言語で600行弱しかありません。今の F# などで組めばもっと短くなるはずです。

そこで、リファレンスガイド を麻雀牌に直してプログラム言語化してみようという試みです。

■言語ルールを決める

文法よりも先に「ルール」を決めます。ええ、麻雀牌なんだから、13牌か14牌がいいですよね。

  1. 順子または暗刻が4つ、対子が1つで、1行14牌でプログラムする。
  2. キーワードは暗刻に割り当てる。
  3. ワードは順子に割り当てる。
  4. 数字、文字列はどうするか検討中。
  5. 14牌で、上がっていなければエラーとする。

5番目が重要ですね。きちんと、上がりを作らないとコンパイルエラーになります。

…ってことにしておきます。

■文法に割り与える

Tiny Forth のリファレンスガイドに準じて、適当に暗刻を割り当てます(覚えづらいので、後で割り当て直しますが)。

DRP スタックに積む [hai]111m[/hai]
DUP スタックに複製を積む [hai]222m[/hai]
SWP スワップする [hai]333m[/hai]
>R  パラメータスタックからリターンスタックへ積む [hai]444m[/hai]
<R  リターンスタックからパラメータスタックへ積む [hai]555m[/hai]

+ 加算 [hai]666m[/hai]
– 減算 [hai]777m[/hai]
* 乗算 [hai]888m[/hai]
/ 除算 [hai]999m[/hai]
% あまり [hai]111s[/hai]

AND 論理積 [hai]222s[/hai]
OR  論理和 [hai]333s[/hai]
XOR 排他的論理和 [hai]444s[/hai]

= [hai]555s[/hai]
< [hai]666s[/hai]
> [hai]777s[/hai]
<= 不要かも [hai]888s[/hai]
>= 不要かも [hai]999s[/hai]
<> [hai]111p[/hai]
NOT [hai]222p[/hai]

メモリ操作用
@ 2バイトスタックに積む [hai]333p[/hai]
! 2バイトスタックに積む [hai]444p[/hai]
@@ 1バイトスタックに積む [hai]555p[/hai]
!! 1バイトスタックに積む [hai]666p[/hai]
#面倒なので、char, int に揃えてしまうか。

出力ワード
. 出力 [hai]777p[/hai]

辞書操作
: … ; … ワードを辞書に登録 [hai]HHH FF[/hai]
VAR 変数を定義 [hai]FFF[/hai]
FGR ワードを削除(不要?)[hai]CCC[/hai]

制御文
IF … THEN … [hai]TTT SSS[/hai]
IF … ELSE … THEN … [hai]TTT NNN SSS[/hai]
BEGIN … END … スタック上の1番目のデータが偽ならば繰り返し [hai]PPP NNN[/hai]
BEGIN … WHILE … WEND … … (不要?)[hai]PPP SSS NNN[/hai]
DO … LOOP …   (不要?)[hai]PPP TTT[/hai]
I カウンタ値のアドレスをスタックに積む [hai]NNN [/hai]

ループ関係は冗長なので、ひとつだけ定義すれば OK かも。

■サンプルコード

先の Tiny Forth のページから “3+4*5” の計算が

3 4 5 * + 

となるので、

[hai]345m 456s 567p 888m 77m[/hai]

ではどうだろうか?順子の頭を数字とみなして計算する感じ。答えは、23 なんだが…分かりづらいことおびただしい w 慣れると打ちやすいかも?

■Pi㊥Pad

麻雀牌専用エディタ。先日、キーボード判別できないことが分かったので、キーボード自体はユーザーが設定ってことになりそうです。クリップボード機能とツイート機能だけあれば十分かと。Windows ストアに近日、公開します。

image

■Wordpress の麻雀牌プラグイン

麻雀牌プラグイン | 1000sei WordPress
http://wordpress.1000sei.com/ja/mahjong/

Unicode の麻雀牌は Live Writer 等で投稿できないので、表示にはプラグインを利用しています(爆

カテゴリー: 雑談 パーマリンク