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