]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex4_6.rkt
Solutions to 4.27, 4.28 and 4.29.
[sicp.git] / src / sicp / ex4_6.rkt
1 #lang racket/base
2
3 (provide let->combination)
4
5 (define (tagged-list? exp tag)
6   (if (pair? exp)
7       (eq? (car exp) tag)
8       #f))
9
10
11 (define (make-lambda params body)
12   (cons 'lambda (cons params body)))
13
14 (define (let? expr)
15   (tagged-list? expr 'let))
16
17 (define (let-bindings expr) (cadr expr))
18 (define (let-bindings-variables bindings) (map car bindings))
19 (define (let-bindings-values bindings) (map cadr bindings))
20 (define (let-body expr) (cddr expr))
21
22 (define (let->combination expr)
23   (let ([bindings (let-bindings expr)])
24     (let ([vars (let-bindings-variables bindings)]
25           [vals (let-bindings-values bindings)]
26           [body (let-body expr)])
27       (cons (make-lambda vars body) vals))))
28
29 (define ns (make-base-namespace))
30 (eval (let->combination '(let ((x 2) (y 3)) (+ x y))) ns)