3 (provide let->combination let?)
5 (define (tagged-list? exp tag)
10 (define (variable? expr)
13 (define (make-lambda params body)
14 (cons 'lambda (cons params body)))
17 (tagged-list? expr 'let))
19 (define (named-let? expr)
20 (if (variable? (cadr expr))
24 (define (let-name expr)
29 (define (let-bindings expr)
34 (define (let-bindings-variables bindings) (map car bindings))
35 (define (let-bindings-values bindings) (map cadr bindings))
36 (define (let-body expr)
41 (define (let->combination expr)
42 (let ([bindings (let-bindings expr)])
43 (let ([vars (let-bindings-variables bindings)]
44 [vals (let-bindings-values bindings)]
45 [body (let-body expr)])
46 (if (not (let-name expr))
47 (cons (make-lambda vars body) vals)
49 (list 'define (let-name expr) (make-lambda vars body))
50 (list (let-name expr) vals))))))
52 (define ns (make-base-namespace))
53 (eval (let->combination '(let ((x 2) (y 3)) (+ x y))) ns)
54 (eval (let->combination '(let ((x 2) (y 3)) (+ x y))) ns)
55 (let->combination '(let fib-iter ((a 1)
60 (fib-iter (+ a b) a (- count 1)))))