■
原因ハケーソ!(・∀・)
(letrec ((map-ident (lambda (str) (canonicalize str))) (regexp-fold (lambda (exp) exp)) (canonicalize (lambda (fun) (regexp-fold fun)))) ;; empty )
map-ident が pass2 を通るとき、その body が (canonicalize str) -> (regexp-fold str) -> str と展開されるけど、二つ目の (regexp-fold str) を展開するとき、pass2/$CALL で pass2/head-lref が呼ばれる。このせいで regexp-fold の参照回数が破壊的に減らされるけど、元の iform の operator が破壊的には更新されていない。だから canonicalize の初期化表現が pass2 を通るとき、operator 位置にある lref の regexp-fold がもう一度 pass2/head-lref を通る。具体的には
--- compile.scm 2005-12-24 17:43:52.000000000 -0800 +++ compile.scm.mutilated 2005-12-24 17:46:40.000000000 -0800 @@ -2926,7 +2926,8 @@ ;; Directly inlinable case. NB: this only happens if the $LREF ;; node is the lvar's single reference, so we know the inlined ;; procedure is never called recursively. Thus we can safely - ;; travarse the inlined body without going into infinite loop. + ;; traverse the inlined body without going into infinite loop. + ($call-proc-set! iform result) (pass2/rec (expand-inlined-procedure ($*-src iform) result args) penv tail?)) (else
とやれば直る。ついでに近くにあった綴り間違いも。
追記: xfce4-terminal が (expand...) の後の \n を喰ってた (80桁目だから)。やめてくれそれ気づかんし…orz
まだ本質的な解決はされづ
Shiro さんはまだ忙しいのかな。この時期だと party で忙しいという可能性もあるんだが…社会人はそんなに甘くないか。