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>
最適化されちゃってそのまんまになっちゃってますね。