最新版 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
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
うは。楽で良いな。