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。