原因ハケーソ!(・∀・)

(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 で忙しいという可能性もあるんだが…社会人はそんなに甘くないか。