現在追っている letrec バグの詳細

最小再現コード

(letrec ([xx (lambda (k)
               (k)
               (xx (lambda () (yy))))]
         [yy (lambda () (cons '() (yy)))])
  (xx (lambda () #f)))

バグの内容

無限ループになるはずが *** ERROR: vector required, but got () とエラーになる。

参考:Gauche が吐く最適化済みコード

($letrec ((yy[2;0] ($lambda[yy;0] ()
                     ($asm (CONS)
                       ($const ())
                       ($call[local] ($lref yy[2;0])))))
          )
  ($call[embed] ($lambda[xx;2] (k[1;0])
                  ($label #0
                    ($seq
                      ($call ($lref k[1;0]))
                      ($call[jump] ($call[embed] ($lambda[xx;2] (k[1;0])
                                                   label#0)
                                     ($lambda[#f;0] ()
                                       ($const #f)))
                        ($lambda[#f;0] ()
                          ($call[local] ($lref yy[2;0])))))))
    ($lambda[#f;0] ()
      ($const #f))))

続きは明日。