(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.