Exercise 4.6.  Let expressions are derived expressions, because

(let ((<var1> <exp1>) ... (<varn> <expn>))
  <body>)

is equivalent to

((lambda (<var1> ... <varn>)
   <body>)
 <exp1>
 
 <expn>)

Implement a syntactic transformation let->combination that reduces 
evaluating let expressions to evaluating combinations of the type shown 
above, and add the appropriate clause to eval to handle let expressions.

————————————————————————————————————————————————————————————————————————

(define (eval exp env)
  (cond ...
        ((let? exp) (eval (let->combination exp) env))
        ...))

(define (let? exp) (tagged-list? exp 'let))
(define (let-body exp) (cddr exp))
(define (let-bindings exp) (cadr exp))

(define (let->combination exp)
  (make-application
    (make-lambda (map car (let-bindings exp))
                 (let-body exp))
    (map cadr (let-bindings exp))))
