Definitions may occur at the
beginning of a <body> (that is, the body of a lambda
,
let
, let*
, letrec
, let-syntax
, or letrec-syntax
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 begin
.