問題4.8

(define (fib n)
  (let fib-iter ((a 1)
                 (b 0)
                 (count n))
    (if (= count 0)
        b
        (fib-iter (+ a b) a (- count 1)))))

;; ->

(define (fib n)
  (let ((a 1) (b 0) (count n))
    (define (fib-iter a b count)
      (if (= count 0)
          b
          (fib-iter (+ a b) a (- count 1))))
    (fib-iter a b count)))

;; こんな感じに変換できればいいかな。

(define (let->combination exp)
  (let ((second (cadr exp)))
    (let ((named? (symbol? second)))
      (let ((bindings (if named? (caddr exp) second))
            (body (if named? (cdddr exp) (cddr exp))))
        (let ((vars (map car bindings))
              (exps (map cadr bindings)))
          (if named?
              (list 'let bindings
                    (append (list 'define (append (list second) vars))
                            body)
                    (append (list second) vars))
              (append (list (append (list 'lambda vars) (cddr exp))) exps)))))))

(define (eval-let exp env)
  (eval (let->combitation exp) env))

(put 'eval 'let eval-let)

(let->combination
 '(let fib-iter ((a 1)
                 (b 0)
                 (count n))
    (if (= count 0)
        b
        (fib-iter (+ a b) a (- count 1)))))

;->
;(let ((a 1) (b 0) (count n))
;  (define (fib-iter a b count)
;    (if (= count 0)
;        b
;        (fib-iter (+ a b) a (- count 1))))
;  (fib-iter a b count))

;; ok !!