syntax-rulesの実装形式
識者のご意見ください #Scheme
syntax-rulesを直接実装するのと、er-macro-transformerを実装してその上にsyntax-rulesを乗せるのではどっちが楽ですか?
https://prog-lang-sys-ja.zulipchat.com/#narrow/stream/345194-.E8.A8.80.E8.AA.9E/topic/Scheme/near/385843270
https://twitter.com/yhara/status/1692440337892233407
Twitterより
ホスト言語でsyntax-rulesのマッチと展開を書くにはそこまで複雑なデータ構造や強い組み込み関数がいらないので、erで書くのと労力はあまり変わらないような気がします。
リネーム機構はどちらの実装でも必要ですし。
ホスト言語で書くとerよりもリソースのオーバーヘッドが少ない分有利かな思います。
https://twitter.com/niyarium/status/1692549303120896033
俺は syntax-rules は複雑過ぎてよく分からなかったから、syntactic-closure を実装して、それを使って er-macro-transformer を実装して、er-macro で SRFI 149 を実装した。
未だに syntax-rules はよく分かってないけど、er-macro が正しく動くなら SRFI 149 参照実装ポン付けが動作する
だから結局、たぶん er-macro で実装するのが楽なんじゃなかろうか派。
どのみち低レベルマクロトランスフォーマは欲しくなるだろうし。
ただ、ホスト言語で直接実装したほうが高速なのは間違いない。
低レベルマクロトランスフォーマの定義がこのファイル。
https://github.com/yamacir-kit/meevax/blob/master/basis/meevax.ss
SRFI 149 は参照実装そのままだけど、Chibi の独自の手続きが使われてるからそれを補う必要がある。 俺は記憶が正しければ 確か sagittarius のコードを参考にしたはず。
https://github.com/yamacir-kit/meevax/blob/master/basis/srfi-149.ss
https://twitter.com/yamacirkit/status/1692522513681805798
#Zulip より
(syntax-rulesの実装にsyntax-rulesが使われているケースがある、という話題に対して)
okuoku
午後5:43
NMoshで使っていたSRFI-72 https://github.com/higepon/mosh/blob/master/boot/runtimes/srfi-mosh/expander.scm がそのケースですね(R5RS syntax-rulesを使ってR6RS syntax-rulesというかsyntax-caseを実装)。NMoshの場合はalexpanderでこのexpander.scmをマクロ機能無しのSchemeに展開することでbootstrapしていました。(N)Moshは、マクロ機能の無い処理系(vanilla-mosh)に、事前にバイトコードに変換しておいたフロントエンド(Psyntax または SRFI-72)とバイトコードコンパイラをくっつけることでR6RS処理系にしています。
処理系ネイティブにsyntax-rulesを実装しているのは例えばGauche https://github.com/shirok/Gauche/blob/dfbbe90109629247490d6a382f3bf79cdb4b58db/src/macro.c#L240 ですね。Gaucheにもer transformerはあって、そっちに載せ替える的な話はあったような。。
個人的には自分のところで使ってるSchemeアプリケーションがHygienicなマクロに依存していないのもあって、Schemeフロントエンドとしては define-macro しかやってないですね。。
むしろ完全にSchemeフリー(無からのビルド時にScheme処理系が不要)なScheme処理系は割と珍しいですね。。ある程度実用されているScheme処理系でビルドにSchemeが不要なものはs7 https://ccrma.stanford.edu/software/snd/snd/s7.html やTinyScheme系列、BiwaScheme、Chibi-schemeとFoment https://github.com/leftmike/foment あたりですかね。普通は、なんだかんだでVMコンパイラやreader、標準ライブラリをSchemeで書いてしまいたいので...
TinySchemeやs7は define-macro しか無いですが、Fomentは syntax-rules をホスト言語(C++)で実装する族 https://github.com/leftmike/foment/blob/6089c3c9e762875f619ef382d27943819bbe002b/src/synrules.cpp 、chibi-schemeはsyntactic closureをホスト言語(C)で実装する族ですね。
ただ、アプリケーション組込とかを考えると、ビルド時にCコンパイラ以外を要求するのはメッチャ分が悪い(e.g. クロスコンパイルが辛い)ので悩みどころです。。実際duktapeにせよQuickJSにせよ組込み処理系ではCソースだけで標準ライブラリも含めて揃うのが普通なので。
#Scheme #マクロ #実装技術