わーい、テトリス言語 Tetrlang 完成したよー\(^o^)/
これはなに?
Tetrlang は、研究の中間発表を1週間後に控えた大学院生の現実逃避によって作り出された言語テトリスにインスパイアされた言語です。
Tetrlang は以下のような特徴をもつ言語です。
- 各命令がテトリスのブロック(テトラミノ)によって表される
- 他のブロックとの境界が分かる限り、(ほとんど)どんな文字でも使うことができる
- 各命令は Brainf*ck の命令と同様の動作する
言語の説明
Tetrlang では、テトラミノによって命令を表します。テトラミノは隣接する4つの同じ文字から構成されます。テトラミノを構成する文字には空白文字以外の任意の文字が許されます。ソースコードを左から右、上から下という順にスキャンして、テトラミノの現れた順番で命令が実行されます。基本的に、テトラミノの(回転による)向きの違いはありません。ただし、後述するIテトラミノだけは、テトラミノの向きによって挙動が変わります。
空白文字(半角スペース U+0020、全角スペース U+3000)は読み飛ばされます。また、Tetrlang には プログラムの "幅" という概念があり、1行がプログラムの幅を超えた文字数(≠バイト数)になると、そこから行末までの文字が読み飛ばされます。プログラムの幅はデフォルトで 20 に設定されます。
命令
Tetrlang は、Brainf*ck の8つの命令に対応した命令をもっています。テトリスの7種のテトラミノが Brainf*ck の各命令に対応します。
以下に、それぞれの命令の意味を説明します。
Tテトラミノ
### #
Brainf*ck の + 命令に相当。ポインタの指すメモリ位置の値を1だけインクリメントする。
Oテトラミノ
## ##
Brainf*ck の - 命令に相当。ポインタの指すメモリ位置の値を1だけデクリメントする。
Sテトラミノ
## ##
Brainf*ck の > 命令に相当。ポインタの指すメモリ位置を1つだけ進めます。
Zテトラミノ
## ##
Brainf*ck の < 命令に相当。ポインタの指すメモリ位置を1つだめ戻します。
Lテトラミノ
# # ##
Brainf*ck の [ 命令に相当。ループの開始を意味します。ポインタの指すメモリ位置の値が0のときは、対応するループの終了位置にジャンプします。
Jテトラミノ
# # ##
Brainf*ck の ] 命令に相当。ループの終了を意味します。対応するループの開始位置にジャンプします。
Iテトラミノ(縦)
# # # #
Brainf*ck の . 命令に相当。ポインタの指すメモリ位置の値をコードポイントとする文字を出力します。
Iテトラミノ(横)
####
Brainf*ck の , 命令に相当。標準入力から1バイト読み込み、その値をポインタの指すメモリ位置に格納します。
サンプルコード
以下に2つのコード例を挙げます。
入力をそのまま出力する echo プログラム。
echo.tetr
★★★□□□◆◆◯◯◯◯▲◇◇☆☆☆ ★ □ ◆◆ ▲ ◇◇ ☆ ▲ ▲
$ java -jar tetrlang-standalone.jar -f echo.tetr 1 1 hoge hoge ^C$
そして、おなじみの Hello world。
hello.tetr
◯◯◯▲▲▲▽■■■◇◇◇★●△△△▼ ◯□□▲▽▽◆■ ☆◇★★●●△▼▼▼ ■■■□ ◯▽◆◆☆☆☆▲★●▽■■■◇ ★■●□◯◯◯△◆▼□▲▲▲▽▽◆■◇◇ ★★●● ☆△△▼▼□□◯◯◯▽◆◆▲◇ ★▽■●☆☆☆△◯▼□▲▽◯ ■◆▲▲▲ ▽▽■■◇◇◇◯◯◯▲▲▽▽■■■★★★ ●▽■△ ◇▼□□◆◆▲ ▽☆☆◯▲★◯ ●●△△ ▼▼■□□◆◆◇★☆☆◯▲▲◯ ● ◯△▲▼▽■■ ●◇◇★★◯◯△▲◯ ▼ ◯▲▲▽▽▽■●●●◇★□◆△△△◯ ▼▼◯ ▲☆◯▲▲▲▽▽▽□□◆◆■■■ ▼ ◯ ◇☆◯★▲●●▽ □◆ ■△ □□◆◆◇☆◯★★●●◯◯▲▲▽▽◆◆△ □□◆◆◇☆◯ ★▼▼◯◯▲▲▽▽◆◆△ ▲▲▽▽◇■■◇◇▼▼★★●△△▼▼▼△ ▲▲▽▽□■■◇◇◆☆★★●◯△△▼▲ ★★★□□□●△◆◆☆☆ ●◯◯ ▲▲▲ ★▼▼ ●●△ ◆☆▼▼●◯□□◆◆ ☆☆▼▼◯◯●△ ▲▲▼▼▽▽□□◆◆■ ☆☆◇★◯◯▼△□▲▲◆◆▽▽☆☆◯◯■ ◇◇★★▼▼ □☆☆◆◆◯◯☆☆◯◯■ ▲▲◇★ ▽▼ □☆☆■■◯◯◇◇★★■ ▲▲ ●●▽△△□▼▼■■□□◇◇★★ ◆◆☆●●▽△△◯▼▼▲▽□□ ◆◆☆ ▽ ◯◯▲▲▽ ☆ ◯ ▲▽ ☆ ▽
$ java -jar tetrlang-standalone.jar -f hello.tetr Hello, world! $
ソースコード
http://github.com/athos/tetrlang から Tetrlang のインタプリタのソースコードを入手することができます。ビルドするためには、Leiningenが必要です。インタプリタを実行するだけなら、付属の tetrlang-standalone.jar を上のサンプルのように JVM 上で実行することができます。ただし、エラー処理は全然やっていないので、変な入力があったときの挙動はよく分かりません。決して、この実装を使ってシリアスなプログラムを作ろうと試みないでください。
開発言語には Clojure を使っています。なんちゃってパーサコンビネータと、CPSなインタプリタという、趣味に走った構成になっています。興味があればそちらもどうぞ。