R6RS Libraries and Macros をmoshに移植する(未遂)
追記 : そもそもmosh -5には健全なマクロが無いらしい( http://d.hatena.ne.jp/mjt/20091024/p1#c1256439992 )。
-http://www.het.brown.edu/people/andre/macros/
psyntaxじゃないほうのR6RS実装。
これもR5RS+αの環境で動作するので、moshのsafe modeを使えばどうにかなる可能性がある。
moshのpsyntaxと違って、こっちの実装は、
- ライブラリ中に複数のライブラリを含めることができる(ただしライブラリファイルのlookupは自分で用意する必要が有る)
- コードをexpandだけする方法がある
という特徴がある。
通常のライブラリ開発であれば、mosh以外のR6RSで実行してみてデバッグするという手法が使えるが、FFIとかsocketのようなmosh固有の機能を使ったものはmoshでデバッグせざるを得ないので非常に大変。
examples.scmの修正
examples.scmはサンプルのライブラリや他のコードを含んでいる。
先頭にある、loadするスクリプトの指定をcompat-r5rs.scmに書き換える。
compatの修正
compat-r5rs.scmのうち、すでに提供されている :
- pretty-print
- memp
- filter
- for-all
は削除する。
expander.scmの修正
expander.scmは、自分で実装したmatchを含んでいる。これはmoshのsafe modeが持っているmatchと衝突するので、名前を適当なものに変える(今回は大文字のMATCHにした)。
しかしエラー。
$ mosh -5 examples.scm Exception: error in raise: unhandled exception has occurred Condition components: 1. &assertion 2. &who: car 3. &message: "pair required" 4. &irritants: (p2) Stack trace: 1. throw: <subr> 2. (pass1/call proc args lvars tail?): compiler-with-library.scm:5422 ...
このp2はexpand.scmの
((matcher "base" (p1 . p2) k arg ...) (matcher "base" p1 "pair" p2 k arg ...))
ここのp2。