Local defines in MIT-Scheme (which I believe is the only one that originally implemented them) do not cause side effects to environments. (define (foo x) (define (bar y) (+ y (baz x))) (define (baz w) (* w x)) ... ) is equivalent to (define (foo x) (letrec ((bar (named-lambda (bar y) (+ y (baz x)))) (baz (named-lambda (baz w) (* w x)))) ...))