Definitions may occur at the
beginning of a <body> (that is, the body of a
expression or that of a definition of an appropriate form).
Such definitions are known as internal definitions as opposed to the top level definitions described above.
The variable defined by an internal definition is local to the
<body>. That is, <variable> is bound rather than assigned,
and the region of the binding is the entire <body>. For example,
(let ((x 5)) (define foo (lambda (y) (bar x y))) (define bar (lambda (a b) (+ (* a b) a))) (foo (+ x 3))) ==> 45
A <body> containing internal definitions can always be converted into a completely equivalent ‘letrec’ expression. For example, the ‘let’ expression in the above example is equivalent to
(let ((x 5)) (letrec ((foo (lambda (y) (bar x y))) (bar (lambda (a b) (+ (* a b) a)))) (foo (+ x 3))))
Just as for the equivalent ‘letrec’ expression, it must be possible to evaluate each <expression> of every internal definition in a <body> without assigning or referring to the value of any <variable> being defined.
Wherever an internal definition may occur
(begin <definition1> …,)
is equivalent to the sequence of definitions
that form the body of the