letrec

ReadingGauche にて R5RS に例示されてるナニの方が良いのでは? なコメントを投げてましたが微妙な事が現実トウヒ時に判明。
R5RS にて例示されているのは以下。

(let ((x 5))
  (letrec ((foo (lambda (y) (bar x y)))
           (bar (lambda (a b) (+ (* a b) a))))
    (foo (+ x 3))))

これを disasm してみたらこうなりました。

gosh> (disasm (lambda () (let ((x 5)) (letrec ((foo (lambda (y) (bar x y))) (bar (lambda (a b) (+ (* a b) a)))) (foo (+ x 3))))))
main_code (name=#f, code=0x80f6e20, size=8, const=0, stack=5):
args: #f
     0 CONSTI(3) 
     1 NUMADDI(5)               ; (+ x 3)
     2 PUSH-LOCAL-ENV(1)        ; (foo (+ x 3))
     3 CONSTI-PUSH(5) 
     4 LREF0                    ; y
     5 NUMMUL2                  ; (* a b)
     6 NUMADDI(5)               ; (+ (* a b) a)
     7 RET 
#<undef>
gosh> 

最適化されちゃってそのまんまになっちゃってますね。