最新版 psyntax への道 その2
昨日の調査により rev1 の psyntax.pp は壊れていることが分かった。手元にある rev0 の psyntax.pp でどうにかしないといけない。
% gosh gosh.r6rs.ss psyntax/psyntax-buildscript.ss gosh: "error": expander "unbound identifier" &condition-rcd
psyntax-buildscript をコメントアウトしていく。
import の (psyntax library-manager) でこのエラーが出ることが分かった。
さらに詳しく追う。file-locator だ。
(define file-locator (make-parameter
rev0 と比較してみよう。rev0 をみると file-locator は library名を受け取り、library-path を探索して実際に存在するライブラリのパスを返す処理。
rev1 になってライブラリが見つからなかったときにエラーを R6RS 的にまじめにあげている。
ここを display にすればとりあえずエラーは出なくなった。
psyntax-buildscript の import を元に戻す。
expander.ss の #' を (syntax ...)に置き換えましょうエラー。
gosh: "error": expander "unbound identifier" (current-library-expander library-expander)
ふむ。current-library-expander は library-manager で定義されているはずだが。
ああさっき library-manager で export を空にしていたからだ元に戻した。
gosh: "error": expander "unbound identifier" (x old* new*)
これだな。
(let*-values ([(x old* new*) (rename (car x*) old* new*)] [(x* old* new*) (rename* (cdr x*) old* new*)]) (values (cons x x*) old* new*))]))
rev0 では多分 let*-values はサポートしていなくて let-values なら OK。
(let-values ([(x old* new*) (rename (car x*) old* new*)]) (let-values ([(x* old* new*) (rename* (cdr x*) old* new*)]) (values (cons x x*) old* new*)))]))
と書き換えた。
gosh: "error": expander "unbound identifier" &condition-rcd
うわ。また出た。
(define (extract-position-condition x) (define-condition-type &source-information &condition
ここだろうな。
(let ([src (annotation-source x)]) (if (pair? src) (begin (display "make-source-condition :hoge") (condition)) ; (make-source-condition (car src) (cdr src)) (condition)))
のように書き換えた。自信ない。
gosh: "error": Compile Error: malformed condition field initializer: (if (null? g$103$11726) '"invalid syntax" (apply string-append g$103$11726))
む。これは Gauche のエラーだ。
condutil.scm 。
(define-syntax condition-sub (syntax-rules () ((condition-sub type inits ()) (make-condition type . inits)) ((condition-sub type (init ...) ((field expr) . more)) (condition-sub type (init ... 'field expr) more)) ((condition-sub type inits (other . more)) (syntax-error "malformed condition field initializer:" other))))
condition-sub という名前がぶつかったかな。ああ。(condition) か。
gosh.r6rs.ss に
(define-syntax condition (syntax-rules () ((_ . other) `(condition ,@other))))
を定義。
r6rs psyntax ready expanding psyntax/compat.ss gosh: "error": unbound variable: hashtable-entries
(define (hashtable-entries hashtable) (let* ([keys (list->vector (hash-table-keys hashtable))] [vals (make-vector (vector-length keys))]) (let loop ([i 0]) (cond [(>= i (vector-length keys)) (values keys vals)] [else (vector-set! vals i (hashtable-ref hashtable (vector-ref keys i))) (loop (+ i 1))]))))
expanding psyntax/compat.ss
gosh: "error": unbound variable: bytevector?
expander.ss の self-evaluating? を減らす。
internal.ss の bytevector? も
r6rs psyntax ready expanding psyntax/compat.ss expanding psyntax/internal.ss expanding psyntax/config.ss expanding psyntax/library-manager.ss gosh: "error": unbound variable: g$116$13221
_______________________________________ 0 (g$156$13229 (case-lambda ((g$156$13273 g$156$13274) (if (g$156$13 ... [unknown location] 1 (g$156$13229 (case-lambda ((g$156$13273 g$156$13274) (if (g$156$13 ... [unknown location]
あー。これは展開済みのコードに jump して発生しているのか。
config.ss で色々設定したところ
(define-option if-wants-letrec* #f)
とするとだいぶ動きが違うようだ。
あと
(define-option if-wants-global-defines #t)
しておかないとまずい。
*** ERROR: unbound variable: assertion-violation
これは gosh.r6rs に追加。
(define (assertion-violation . args) (apply error args))
expanding psyntax/library-manager.ss *** ERROR: macro-transformer "BUG: cannot find transformer" let-values
あれー。こまったな。
library-manager.ss は1箇所しか let-values がないので
; (let-values (((p extract) (open-string-output-port))) (call-with-values (lambda () (open-string-output-port)) (lambda (p extract)
とごまかしておこう。
重要なメモ
きな臭いのは2点。
- condition-type 実装のタイミング
- let-values の展開がうまくいかないのはおかしいよね
- let*-values のあれが原因では。