近&況

Recent Posts
Edit

syntax-rules進捗

2017-02-06

去年の夏頃から、BiwaSchemeにsyntax-rulesを入れようと思ってぼちぼち調べてたんだけど、どうもこれは本腰入れて調べないと進捗しないなということで、年末からいろいろ文献を読むなどしていた。

その成果がこちら。

swapマクロを展開させてみたところ

orrというマクロを素朴に展開すると、マクロ内で使っているtという変数名が呼び出し側で定義しているtと衝突してしまう。これを自動でt.0とt.1にリネームしている、という図。

ソースコードはブランチにpushしてある。まだhygenic macroに対応したエクスパンダが本体とは独立に存在するという状態で、最終的にはこれで本体のエクスパンダ(Biwascheme.Interpreter.expand)を置き換えるということになる。

読んだものとか

最初は「syntax-rules 実装」とかで検索してたんだけど全然資料がなくて、上位互換であるsyntax-caseについての文献を読んでいた。

ビューティフルコード

25章がDybvig先生によるsyntax-caseの実装についての寄稿で、結局これが一番参考になった。エッセイ集にこの内容ぶち込むのすごい。

日本語版と英語版のどちらを読むかは悩ましいところで、日本語版の方が概要を掴むのは早いと思うが、多少意味が取りづらい箇所がある。

論文

これもsyntax-caseの説明で、範囲はビューティフルコードとだいたい同じ。

ビューティフルコードも論文の方も、方針が詳しめに解説されているという感じで、詳細な全体像は載っていない。実装へのリンクとか付けてほしい…。書いてない部分は想像力で補完する必要がある。

今後の予定

とりあえず最小の例がうまく動いたというだけなので、リリースにはまだたくさんの作業が残っている。

が、まあ夏〜秋頃を目標にぼちぼちとやっていきたい。というのもBiwaSchemeは僕の中ではサイドプロジェクトという位置づけなので、静的型付け言語の実装の方をメインにやっていきたいのだった(今日LLVMのエントリを書いたのはこっちの作業)。

とはいえ今年はBiwaScheme 10周年イヤー(!)なので、今年中には実装を済ませて、1.0.0をリリースしたいと考えている。規格の範囲にはまだ未実装の大物がいくつか残っているが(ライブラリ、例外、dynamic-windなど)、アプリを作って遊べる程度の能力はもうだいぶ前からあるので。

追記

書き忘れていたことを一つ。書籍・論文の他には「既存の処理系の実装を読む」という方法があって、実際にいくつか眺めてみたのだけど、これはあまりうまく行かなかった。hygenic macroというシステムは処理系全体のさまざまなもの(シンボル、マクロ展開器、ライブラリシステム等)と関係しているため、処理系のどの部分まで読めばいいかの判断が難しいのと、処理系によって実装が全然違う(syntax-rulesだけを実装しているもの、psyntax経由でsyntax-rulesとsyntax-caseを実装しているもの、独自の低レベルマクロシステムの上にexplicit renamingとsyntax-rulesを実装しているもの、etc.)というのが大変だった。