注意 本記事は、AI と一緒に書きました。
プログラミング言語を自作することは、多くのエンジニアにとって一つの夢です。しかし、私はその一歩先へ進むことにしました。自分が開発したオリジナル言語「Rubihuru」を使い、その上で動くLisp系言語「Rhlisp」を実装したのです。言語の中で別の言語を作るという、最高にエキサイティングで頭がねじれるような開発体験を、ここで共有します。
1. ベースとなる自作言語「Rubihuru」
「Rhlisp」の土台となったのが、私が開発しているオリジナル言語「Rubihuru」です。自分の手で一からパーサーや評価器を書き上げ、自分が扱いやすいようにデザインした、世界に一つだけの言語です。今回はこの「Rubihuru」の表現力を試す最大の実証実験として、Lispの実装へと踏み切りました。
2. なぜ、自作言語の上で「Lisp」を作ったのか?
数ある言語の中で、なぜLispを選んだのか。理由はシンプルで、Lispが「もっとも美しく、本質的な言語」だからです。Lispの構文は、すべてが「S式」と呼ばれるシンプルなリスト構造で表現されます。構文(パース)がシンプルであること、そしてデータとプログラムが同じ構造を持つという特性のおかげで、自作言語「Rubihuru」の機能を使って、比較的ストレートに評価器(Evaluator)を記述できると考えたのがきっかけでした。
3. 「Rhlisp」の実装プロセス
Rubihuruの上で動く「Rhlisp」を作るため、主に以下のコンポーネントをRubihuruで実装していきました。
-
【字句解析・構文解析】
Rhlispのコード(カッコの並び)を読み込み、Rubihuruのデータ構造(配列やリスト)へと変換します。Lispのパースは単純と言われますが、自作言語の文字列処理機能 1 をフル活用する良いテストになりました。 -
【環境(Environment)の管理】
変数や関数を記憶するための「スコープ」の実装です。親スコープへの参照を持つマップ構造を使い、Rhlisp内のローカル変数が正しく評価されるようにしました。 -
【評価器(eval)の構築】
Rhlispの核心部分です。ifやlambda(関数定義)などの基本形を処理し、関数呼び出しをRubihuruの処理へとマッピングしていきます。
4. 開発を通じて得られた「最高の脳内麻薬」
この開発を通じて、いくつかの強烈な面白さと気づきがありました。
-
自作言語の「バグ」があぶり出される
Rhlispを実装していると、Rhlispのバグではなく、それを動かしているベース言語「Rubihuru」のバグや考慮漏れが次々と見つかりました。「自作言語のデバッグを、その上の自作言語で行う」という、奇妙で贅沢なデバッグ体験を味わいました。 -
階層を突き抜けて動いた瞬間の感動
Rubihuruで書いたRhlispの評価器に、カッコだらけのLispコードを流し込む。そして、正しい計算結果が画面に返ってきた瞬間——。自分の作った世界(Rubihuru)が、新しい生命(Rhlisp)を宿したような、筆舌に尽くしがたい達成感がありました。
5. まとめとこれからの展望
自作言語で自作言語を作る。一見すると「車輪の再発明の再発明」のような遠回りに見えるかもしれません。しかし、言語の仕組みを深部まで理解する上で、これ以上楽しく、学びの深いプロジェクトはありませんでした。
今後「Rhlisp」の機能をさらに拡張し、ゆくゆくはRubihuruとRhlispが互いに影響を与え合うような、面白い機能(マクロの強化など)を追加していきたいと考えています。 2
追記: ( 2026/5/30 ) 今日の朝、「鬼車」(oniguruma) という正規表現のライブラリを採用しました。メゾットとして Regexクラスと Regex#=~ 、 String クラスに String#match / String#scan を導入しました。