最新版 psyntax への道 その3

rev0 の expander.ss を見ると、core-macro-transformer で let-values の展開が let-values-transformer にマッピングされている。

rev1 では?
macro-transformer で let-values => let-values-macro, let*-values => let*-values-macro と展開しているはず。
あれ?ちょっと前に let-values-macro 書き換えた気がする。
これをまず元に戻す。いや待てよ。psyntax.pp は rev0 のものだからlet-values を let*-values を用いて展開してはいけないのだ。
つまり正解は let-values -> call-with-values かな。

gosh: "error": macro-transformer "BUG: cannot find transformer" let-values

これは rev1/expander.ss の core-macro-transformer が出しているエラー。
syntax-type が core-macro だと core-macro-transformer にいくっぽい。

つまり psyntax-buildscriptで

;    (let-values          (core-macro . let-values))

コメントアウトすれば良いのかな?

gosh: "error": unbound variable: make-undefined-violation
gosh: "error": unbound variable: make-message-condition
(define (make-undefined-violation . args) (display args) `(undefined-violation ,@args))
(define (make-message-condition . args) (display args) `(make-message-condition ,@args))
(define (make-who-condition . args) (display args) `(make-who-condition ,@args))

としたがうまく動いていないようだ。落ち着こう。分かった。
core-macro ではなくて macro にマッピングすれば良いのだね。

    (let-values          (macro . let-values)) ;; added


さてどうよ?

Happy Happy Joy Joy

きた。ついに psyntax.pp が展開できたよ。
でもこれで終わりではない。今できたての psyntax.pp で psyntax が展開できなければ意味がない。

あれ反応が返らないな。トイレに行ってくる。戻っても終わっていなかったら無限ループと。
うは。終わってた。時間がかかるだけか。

めでたく動いたので、積み残しの todo を全部こなしていこう。

Hello, World 動く?

=> ok

速度はどう?

Gauche だと rev0 => 350msec, rev1 => 500msec 。

Gauche のプロファイラで見てみると。pass1 はしょうがないとして arity がやたらと多い。

pass1                                                54852  0.0013     7( 16%)
arity                                                34681  0.0012     4(  9%)
(make-dispatcher make-dispatcher)                    34628  0.0012     4(  9%)
procedure-arity-includes?                            34681  0.0009     3(  7%)

psyntax は arity の存在など知るはずもない。どこかを経由して呼ばれているに違いない。
気になるので調べる。 procedure-arity-includes? から呼ばれている。
make-dispatcher だ!。これは Gauche/src/procedure.scm の case-lambda マクロだ!

つまり内部で展開するときに case-lambda にしているっぽい。

(define-option if-wants-case-lambda    #f)

としたら速くなった。

Mosh に組み込めるか?

これは大変重要なので一度試してみないといけない。
後で自動化するとして手順をまとめよう。と思ったが psyntax.pp をロードするだけだな。

% ../mosh mosh.r6rs.ss wiki

うごいた。

rev0 と rev1 の機能差

diff をとる。

diff --exclude "*svn*" -ur psyntax/  psyntax-revisions/rev1/psyntax 
  • compat.ss に annotation の機能が追加されている。ソースコード情報が付加できるようだ。
  • scheme-report-environment が追加された。
  • 内部のエラー処理が assertion-violation などまじめな R6RS になった
  • マクロの展開方法が変わった

rev1 -> rev5

ほとんど変化なし。

rev5 -> rev6

make-record-printer
load-precompiled-library

おお。ライブラリを serialize して load する仕組みが追加された模様。
いやでも良く読んでみると serialize-all から selialize が呼ばれているが定義されていないね。

rev6 -> rev7

serialize が IronScheme 側に実装されているような記述が見受けられる。

rev7 -> rev8

あまり変化なし。

rev8 -> rev9

機能はあまり変化せず。
実装がだいぶ変わっている。

revision まとめ

  • エラー表示用にソースコード情報を annotation として含まれるようになった
  • プリコンパイルドライブラリの枠組みが追加された
    • これは処理系との連携が必要で IronScheme はこれに成功している

というあたりかな。

IronScheme の serialize を見る

using System.Runtime.Serialization

うは。楽で良いな。