psyntax 最新版への道 5

前回までのあらすじ

psyntax-rev10 が展開できたが実行すると

1. &assertion
2. &who: (lambda G12971id G12972name G12973ver G12974imp* G12975vis* G12976inv* G12977exp-subst G12978exp-env G12974
3. &message: "wrong number of arguments (required 14, got 11)"
4. &irritants: ()

と怒られる。

さて

上のエラーは psyntax-buildscript-mosh.ss で

`(install-library
             ',id ',name ',version ',import-libs ',visit-libs ',invoke-libs
             ',subst ',env values values ',visible?)

というコードがあるのだけど、これは psyntax-rev0 用のコードなので直す必要がある。
ironscheme-buildscript.ss を参考にすれば良いだろう。

`(install-library
             ',id ',name ',version ',import-libs ',visit-libs ',invoke-libs
             ',subst ',env values values '#f '#f ',visible? '#f)

増えた引数を #f にすれば良いみたい。
次。

 Condition components:
    1. &assertion
    2. &who: apply
    3. &message: "invalid application"
    4. &irritants: (#f)
(G12494G12365make-parameter (G20957G20877command-line)

command-line が unbound だ。get-command-line をバックエンドが export するようにするか。

 Condition components:
    1. &assertion
    2. &who: library-path
    3. &message: "not a list of strings"
    4. &irritants: (".")

リストにした。

(library-path '("."))

とりあえず空振り実行するようになった。
psyntax-rev0 のように main.ss に

  (display "r6rs psyntax ready\n")
  (let ((args (command-line)))
    (unless (= (length args) 2)
      (display "provide a script name argument\n")
    )
    (let ((script-name (car args)) (args (cdr args)))
      (load-r6rs-top-level (car args) 'load)))

実行してみたが。途中で ASSERT で止まる。

  (define library-body-expander
    (lambda (name exp* imp* b* top?)
      (define itc (make-collector))
      (parameterize ((imp-collector itc)
                     (top-level-context #f))

parameterize で死ぬみたい。
展開後のコードを見てみたらこれは明らかにおかしいね。

((lambda (G18692G18688cdr |G18693|G18689((

なぜこんなことになったのだろうか?→gensym の引数に pair が渡りひどいことに。

 Condition components:
    1. &assertion
    2. &who: open-file-input-port
    3. &message: "string required, but got (library-letrec* () ((G0 G1 (begin (display '\"muge!!!\") (void)))) (void))"
    4. &irritants: ()

そういえば library-letrec* はバックエンドに定義されていないので config で #f とした。ついでに case-lambda も。

    2. &who: open-file-input-port
    3. &message: "string required, but got ((lambda (G0) (begin (set! G0 (begin (display '\"muge!!!\") (void))) (void))"
    4. &irritants: ()

(set-symbol-value! 'compile compile) と上書きされていたのが原因だった。
ついに動いたよ!わーい。