(let <name> ((<var1> <val1>)...(<varN> <valN>)) <expr1> . . . <exprM>)=>
((letrec
((<name>
(lambda (<var1>...<varN>)
<expr1>
.
.
.
<exprM>)))
<name>) <val1>...<valN>)
It can be used as follows:
(while <test> <expr1>...<exprN>)=>
(letrec
((loop
(lambda ()
(if <test>
(begin
<expr1>
.
.
.
exprN>
(loop))))))
(loop))
Define while using define-macro. You must take into account
the potential variable capturing that is caused when the variable
loop occurs free in test or expression.