(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)))))