psyntax への道7
全ての既存のテストがうまく動いた。(rev 485)。
さて次のtodoは
- http://d.hatena.ne.jp/higepon/20081002/1222959976 の muge.scm は動くようになったのか?
だ。試してみたら動くようになっていた。やったね。
psyntax.scm を利用して psyntax.scm を展開する
~/mosh/mosh psyntax.scm psyntax-buildscript-mosh.ss Condition components: 1. &assertion 2. &who: (lambda G655 G656 G657 G658 G659 G660 G661 G662 G663 G664 G665 G666 G667 G668) : unknown location 3. &message: "wrong number of arguments (required 14, got 11)"
これは psyntax-buildscript-mosh.ss の install-library の問題。
Condition components: 1. &error 2. &message: "undefined prim ~s" 3. &irritants: (ellipsis-map)
define-prims に ellipsis-map を入れる。
Condition components: 1. &assertion 2. &who: (lambda G8673 G8674 G8675) : unknown location 3. &message: "wrong number of arguments (required 3, got 4)"
(boot-library-expand code) の返す多値の個数が変わってた。
よし展開できた。
- 既存のテスト→OK。
- define-record が展開されない件は修正されているか?→OK。
- let*-values の展開→OK。
library-path を利用して unicode.ss は分離できるか?
main.ss で /tmp/ をライブラリパスに入れてみる。
(library-path '("." "/tmp/"))
/tmp/hige.ss
(library (hige) (export higepon) (import (rnrs)) (define higepon 'higepon) )
(import (hige) (rnrs)) (display higepon)
ばっちりだわ。
read-annotated をどうするか?
extract-position-condition などで使われている。
ソースコード情報をとる方法は提供しているので compat.ss で以下のように定義した。
(define read-annotated read) (define (annotation-stripped x) (annotation-expression x)) (define (annotation? x) (source-info x)) (define (annotation-source x) (source-info x)) (define (annotation-expression x) (if (pair? x) (cons (car x) (cdr x)) (display "line:46\n")))
んで、色々工夫してメッセージに反映されるようにした。
Condition components: 1. &who: define 2. &message: "a definition was found where an expression was expected" 3. &syntax: form: (define a 3) subform: #f 4. &source-information: file-name: "./hige.scm" line: (6) 5. &trace: #<record stx>
compile-core は何を提供するものか?
load-r6rs-top-level(closure) -> pre-compile-r6rs-top-level -> compile-core の順。
ちょっと分からないのであとで追う。
serialize 周りを先にやった方が良かろう。
serialize
serialize-library には何が渡るか。
("./hige.scm" (G3 (hige) () ((G21064 (rnrs))) () () () ((G0 global . G2G1a)) (void) (begin (define G2G1a '#f) ((lambda (G1a) (begin (set! G1a '3) (set! G2G1a G1a))) '#f)) #t))
なるほど。ふむ。仕組みは分かった。load も出来そうだな。でも後回し。