はじめに
奇抜な言語を作りたいと思っていた私。大学にて改めてコンパイラを学びなおす。
「構文木って美しいよなぁ...」→ 「ん?これを直接落とし込むプログラム言語を作ればいいじゃないか!」
そうして Trees 言語がうまれたのであった。
チュートリアル は GitHub に公開しました。この記事ではそれをさらにまとめたものを説明します。
「Trees」は、こんなプログラミング言語です
今回私が作成したブロックプログラミング言語 Trees では、構文木チックにプログラムを記述することが可能です。
例えば、下のプログラムは「3 × 4」...つまり「12」を出力します。
3 × 4 を表示するプログラム - 12を表示
┌─────┐
│print│
└───┬─┘
┌───┴─┐
┌───┤ * ├──┐
│ └─────┘ │
┌───┴─┐ ┌───┴─┐
│ 3 │ │ 4 │
└─────┘ └─────┘
次はFizzBuzzのプログラムです。
このプログラムは "12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz" を表示します。
FizzBuzz
┌───┐
│seq├─────────────────────┐
│ ├───────────────┐ ┌─┴───┐
└─┬─┘ ┌┴──┐│print├──┐
┌─┴────┐ ┌──────┤for│└─────┘┌─┴─┐
│defset├─┐ ┌┴─┐ ┌──┤ │ │out│
└─┬────┘ │ │15│ │ └─┬─┘ └───┘
┌─┴───┐┌─┴┐└──┘┌┴──┐┌•──┐
│"out"││""│ │"i"││set├───┐
└─────┘└──┘ └───┘└─┬─┘ ┌┴─────┐
┌─┴───┐│strcat│
│"out"│└┬───┬─┘
└─────┘┌┴──┐│
│out││
└───┘│
┌─────────────────────┘
│ ┌───────────────┐ ┌───────────┐ ┌───┐
┌┴──┐│ ┌┴──┐│ ┌┴──┐│ ┌┴─────┐
┌───────┤if0├┘ ┌──────┤if0├┘ ┌──────┤if0├┘ │to str│
┌┴┐ └┬──┘ ┌┴┐ └┬──┘ ┌┴┐ └┬──┘ └┬─────┘
│%├───┐ ┌┴─────────┐│%├───┐ ┌┴─────┐│%├───┐ ┌┴─────┐┌┴┐
└┬┘ ┌┴─┐│"FizzBuzz"│└┬┘ ┌┴┐│"Fizz"│└┬┘ ┌┴┐│"Buzz"││+├─┐
┌┴┐ │15│└──────────┘┌┴┐ │3│└──────┘┌┴┐ │5│└──────┘└┬┘┌┴┐
│+├─┐└──┘ │+├─┐└─┘ │+├─┐└─┘ ┌┴┐│1│
└┬┘┌┴┐ └┬┘┌┴┐ └┬┘┌┴┐ │i│└─┘
┌┴┐│1│ ┌┴┐│1│ ┌┴┐│1│ └─┘
│i│└─┘ │i│└─┘ │i│└─┘
└─┘ └─┘ └─┘
自作のプロシージャ(ほかの言語で言う関数)を定義し、処理の共通化をはかることもできます。
プロシージャ定義 - 6 を表示
┌───┐
│seq├────────────────────┐
└─┬─┘ ┌┴────┐
┌─┴─────┐ │print│
│defproc├─────┐ └┬────┘
└┬──────┘ ┌•┐ ┌┴────────┐
┌┴──────────┐│*├─┐ │two times│
│"two times"│└┬┘┌┴─┐ └┬────────┘
└───────────┘┌┴┐│$0│ ┌┴┐
│2│└──┘ │3│
└─┘ └─┘
おわりに
無粋ながら Trees 言語は完全にネタとして作ったことを申し添えておきます。
GitHub
コード
チュートリアル