SICP Practice

Practice 4.20

(define (letrec->let exp)
	(list 'let 
        (let-init-bindings exp)
        (append (let-set-val exp) (letrec-body exp))))

(define (letrec-bindings exp)
  (cadr exp))

(define (let-init-bindings exp)
  (map (lambda (x) (list (car x) '*unassigned*)) (letrec-bindings exp)))

(define (let-set-val exp)
  (map (lambda (x) (list (car x) (cadr x))) (letrec-bindings exp)))

(define (letrec-body exp)
  (caddr exp))