psyntax 最新版への道 6

さて落ち着こう。最低限のコードは動くようになった。この後やるべきことをリストアップし優先順位をつけよう。

リストアップ

上から順にこなしていく。長い道のり。

  • psyntax.scm を既存のテストに通す
    • guard マクロの展開がおかしい気がするので expander.scm をいじった
  • http://d.hatena.ne.jp/higepon/20081002/1222959976 の muge.scm は動くようになったのか?
  • psyntax.scm を利用して psyntax.scm を展開する
    • 展開後の psyntax をテストに通す
    • define-record が展開されない件は修正されているか?確認
  • library-path を利用して unicode.ss は分離できるか?
  • compile-core は何を提供するものか?
  • read-annotated をどうするか?
  • serialize-library をどうするか?
  • make-record-printer をどうするか?
  • REPL はできるのか?
  • local-library-path をきちんと定義する
  • load-r6rs-top-level の closure/compile は何のためのものか?動くのか?
  • trace-printer とは何か?
  • library-letrec を導入するか?
  • case-lambda を導入するか?
  • let*-values は展開できるようになったか?
  • isR6RS mode を戻す

psyntax.scm を既存のテストに通す

問題発覚。以下のようなコードで Mosh 本体が落ちる。

 (define-record-type (point make-point point?)
    (fields (immutable x point-x)
            (mutable y point-y set-point-y!))
    (nongenerative
     point-4893d957-e00b-11d9-817f-00111175eb9e))

gdb で見てみると Vector.cpp の Pair::length で落ちている模様。

    MOSH_ASSERT(pair.isPair() || pair.isNil());
    num_ = Pair::length(pair);

list->vector に dot pair が渡されたのが原因でおかしくなっている。
list? でちゃんとチェックしよう。

   1. &assertion
   2. &who: list->vector
   3. &message: "list required, but got ((#<record stx> #<record stx>) . #((#<record stx> #<record stx>)))"

やっと何が問題か見えてきた。
Mosh が悪い。vector-map の実装が間違っていて死んでた。ひどい実装だった。

(つづく)