psyntax への道7

全ての既存のテストがうまく動いた。(rev 485)。

さて次のtodoは

だ。試してみたら動くようになっていた。やったね。

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 も出来そうだな。でも後回し。