Debug 中
その8
うーむ、よくわからない。Compiler の構造が。というか #?= の仕掛け方が。何か build に失敗する。どっかで install file 自動生成の邪魔になってるのかな。
今日はもう寝よ。明日はちょっと弄れなさそうだなあ…まあなるようになる。
その7
だらだら読んでても能率が上がらないので #?= を compiler に埋めるという暴挙に出てみました。一度 >&/dev/null つけずに make してしまって感動。そんな事ばっかしてるから閾値が上がるんですね。
その6 letrec
letrec だと再現条件がちょっと変わるようだ。これは 0.8.4 [utf-8, pthreads] で確認。とかなんとかやって全部調べたけど、letrec で大丈夫な順序は define で error になって、vice versa みたい。となると情報としての価値は低いねこれ。
関数 m, c, r を定義し、m -> c -> r -> id の順に呼び出すように body をそれぞれ書く。各関数は一つの引数をとって、自分がもらったものを次の関数に末尾呼び出しで渡す。id は identity mapping。どの順番で定義を並べると error が出るか調べた結果、以下の通りになった。
出力: mcr define: OK letrec: Error mrc define: OK letrec: Error cmr define: Error letrec: OK crm define: Error letrec: OK rmc define: OK letrec: Error rcm define: Error letrec: OK
;; Script (define amb-fail (lambda _ (raise 'no-solution))) (define (amb choices) (let ((old-cont amb-fail)) (set! amb-fail (call/cc (lambda (esc) (letrec ((next (lambda () (set! choices (cdr choices)) (esc next)))) next)))) (if (null? choices) (old-cont) (car choices)))) (define (assert pred) (or pred (amb '()))) (define procs '((m . (map-ident (lambda (s) (canonicalize s)))) (c . (canonicalize (lambda (f) (regexp-fold f)))) (r . (regexp-fold (lambda (s) s))))) (define (main args) (guard (dummy (else 0)) (let ((a (amb procs)) (b (amb procs)) (c (amb procs))) (assert (not (or (eq? a b) (eq? a c) (eq? b c)))) (for-each (lambda (x) (display (car x))) (list a b c)) (newline) (let ((test (lambda (form) (if (guard (dummy (else #f)) (eval form (null-environment 5) )) (display "OK") (display "Error")) (newline) ))) (display " define: ") (test `(define (rename) ,@(map (lambda (x) (cons 'define (cdr x))) (list a b c)) #t)) (display " letrec: ") (test `(define (rename) (letrec ,(map (lambda (x) (cdr x)) (list a b c)))))) (newline) (assert #f))))
その5 let
む、(let loop ()) は別に named-let でなくてもいいのか。何か S 式が置いてあれば落ちるようだ。っていうかあれか…そもそも局所関数を compile する条件になってるだけか。
その4 症状覚書
Inline 三段めで失敗するらしい。二つで相互再帰すると通る。
その3
あ、comment 見てなかったけど、shiro さんが潰しにかかってるみたい。
でもいいや、自分でも読んでみよう。Log 書きより楽しそうd(ry
その2
最新版で再現するか確認するべく CVS 版を checkout …したやつが置いてあった。
Build できない orz
Assertion failure とか出てるし… C level で backtrace とか出てるし…
CVS 版てこういうもんですかね。これを相手にする気は起きないので、最新の package 版 (0.8.6) を落とす。再現した。
その1
ここまで減らした。Inlining で失敗してるんだろうか。でも (let loop ()) が消せないのが謎。
$ cat (define (rename) (define (canonicalize func-name) (regexp-fold func-name )) (define (regexp-fold str) str) (define (map-ident str) (canonicalize str)) (let loop ()) ) jun@debian /dvl/uim/org/branches/r5rs/sigscheme $ gosh -V Gauche scheme interpreter, version 0.8.4 [utf-8,pthreads] jun@debian /dvl/uim/org/branches/r5rs/sigscheme $ gosh rename-functions.scm *** ERROR: Compile Error: [internal error] stray local variable: "./rename-functions.scm":1:(define (rename) (define (canonicali ... Stack Trace: _______________________________________