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 の実装が間違っていて死んでた。ひどい実装だった。
(つづく)