問題4.8 – SICP(計算機プログラムの構造と解釈)その181

問題4.8

名前付き let で書いた Fibonacci 手続きは、

(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)
  (define (fib-iter a b count)
    (if (= count 0)
        b
        (fib-iter (+ a b) a (- count 1))))
  (fib-iter 1 0 n))

これにもとづいて、名前付き let が使えるようにする。

(define (let->combination exp)
  (if (pair? (car (let-clauses exp)))
      (expand-let-clauses (let-clauses exp))
      (expand-named-let-clauses (let-clauses exp))))

(define (named-let-var clauses) (car clauses))

(define (named-let-bindings clauses) (cadr clauses))

(define (named-let-body clauses) (caddr clauses))

(define (expand-named-let-clauses clauses)
  (make-begin
    (list
      (list 'define (cons (named-let-var clauses)
                          (map car (named-let-bindings clauses)))
            (named-let-body clauses))
      (cons (named-let-var clauses)
            (map cadr (named-let-bindings clauses))))))

実行結果

;;; M-Eval input:
(define (fib n)
  (let fib-iter ((a 1)
                 (b 0)
                 (count n))
       (if (= count 0)
           b
           (fib-iter (+ a b) a (- count 1)))))

;;; M-Eval value:
ok

;;; M-Eval input:
(fib 10)

;; M-Eval value:
55
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»