Jonathan, it isn't clear to me from your message, but you don't make a
distinction between internal definitions and incremental definitions.
Internal definitions are just "aux" variables in the conventional
sense, and we in fact implement them syntactically. We actually have
"real auxes" that are part of an existing frame, but in the absence of
these one can rewrite
(define (foo ...)
(define (bar ...)
...)
...)
as
(define (foo ...)
(let ((bar ...))
(set! bar (named-lambda (bar ...) ...)
...)
Our implementation (very carefully!) does not say that
(define x 3)
(define (foo...)
(define y (+ x 4))
(define x ...)
...)
will behave in a "reasonable" way. In a sense we have put the issue
off, but the accepted semantics of internal DEFINE is that it is just
a different syntax for LABELS.