We note that
(define (fib n) (let fib-iter ((a 1) (b 0) (count n)) (if (= count 0) b (fib-iter (+ a b) a (- count 1)))))
is equivalent to
(define (fib n) (define (fib-iter a b count) (if (= count 0) b (fib-iter (+ a b) a (- count 1)))) (fib-iter 1 0 n))
Therefore we can implement “named let” as follows.
(define (named-let? exp) (if (variable? (cadr exp)) true false)) (define (named-let-name exp) (cadr exp)) (define (named-let-assignment exp) (caddr exp)) (define (named-let-body exp) (cdr (cdr (cdr exp)))) (define (let->combination exp) (if (named-let? exp) (transform-named-let (named-let-name exp) (named-let-assignment exp) (named-let-body exp)) (transform-let (let-assignment exp) (let-body exp)))) (define (transform-named-let name assignment body) (sequence->exp (list (cons 'define (cons (cons name (let-var assignment)) body)) (cons name (let-exp assignment)))))
See also SICP Exercise 4.6
Posted by Weiqun