最新版 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 のあれが原因では。