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:
_______________________________________