2015/12/19
SICP 問題 4.08
let->combinationの変更ですんでいるのでevalは変更しなくていい.
(define (named-let? exp) (symbol? (cadr exp)))
(define (named-let-func-name exp) (cadr exp))
(define (named-let-parameters exp) (caddr exp))
(define (named-let-variables exp) (map car (named-let-parameters exp)))
(define (named-let-expressions exp) (map cadr (named-let-parameters exp)))
(define (named-let-bodys exp) (cdddr exp))
(define (make-definition variable value)
(list 'define variable value))
(define (named-let->define func-name variables expressions bodys)
(make-begin (list (make-definition func-name (make-lambda variables bodys))
(cons func-name expressions))))
(define (let->combination exp)
(if (symbol? (cadr exp)) ;; 2番目の要素がシンボルならnamed-let
(named-let->define (named-let-func-name exp)
(named-let-variables exp)
(named-let-expressions exp)
(named-let-bodys exp))
(cons (make-lambda (let-variables exp)
(let-bodys exp))
(let-expressions exp))))
gosh> (let->combination '(let fib-iter ((a 1)
(b 0)
(count n))
(= 1 1)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1)))))
((define fib-iter
(lambda (a b count)
(= 1 1)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1)))))
(fib-iter 1 0 n))