Gauche:Translation:Devlog:マクロシステム拡張
(原文: Macro system extension)
私はついに syntax-rules 拡張 (srfi:46) を Gauche に追加しました。 それは Gauche の健全なマクロシステムを (いくつかの既知のバグを除いて) R7RS 互換にします。
現在の健全なマクロの展開器は C で書かれ、醜いスパゲッティの山です。
元々の私の計画はレガシーコードを捨てて新しい健全マクロシステムの基盤として explicit-renaming マクロ展開器を書き、その上に syntax-rules を実装することでした。
健全性のために何をしているか明白なので私は ER マクロが好きです。 利用するための最も簡単なものである必要はありません。 入力フォームの解体や識別子の陽なリネームは日常的なプログラミングでは面倒でしょう。 しかし、これらのものは他のツールを組合わせることによって容易に軽減することが出来ます。 例えば、入力フォームの展開のために util.match マッチャを使うことが出来ます。 (マクロシステムに結び付けられた他のパターンマッチャにかわりに。)
実際、リポジトリの er-macro ブランチで ER マクロをある程度実装しました。 しかし、低レベルマクロレイヤを完全に置換えるにはもっと時間が必要であることがわかりました。 ER マクロ、それがマクロ呼出し内でシンボルを捕捉するために生シンボルをマクロ展開器によって挿入することが許すこと、全てのシンボルを識別子に変える現在の syntax-rues 実装、これらの間で互換性を保つことが大きな問題です。 (同じ問題が日本語で mjt によって ここ に書かれています。)
私は R7RS 互換リリースを早めに出したいので、 srfi-46 として動作させるためにレガシーコードに更にスパゲッティを追加しました。
* * *
この拡張機能は syntax-rules をより使い勝手のよいものにすることを私は実感しました。 私は define-values フォームもまた R7RS に追加しました。 以下のような一般形式を許します。
(define-values (x y . z) (values 1 2 3 4)) z => (3 4)
R7RS syntax-rules で proper list と inproper list を区別するのは難しくありません。 (Gauche:lib/gauche/defvalues.scm 参照)