さかもとのブログ

つらつらと

演習問題4.20

a

式の変換は以下のようにする.

(letrec ((fact (lambda (n)
                 (if (= n 1)
                     1
                     (* n (fact (- n 1)))))))
  (fact 10))

(let ((fact '*unassigned))
  (set! fact (lambda (n)
               (if (= n 1)
                   1
                   (* n (fact (- n 1))))))
  (fact 10))

これを実現するために,

(define (letrec? exp) (tagged-list? exp 'letrec))

(define (letrec->combination exp)
  (define bindings (let-bindings exp))
  (define body (let-body exp))
  (if (null? bindings)
      '()
      (cons 'let
            (cons
               (map (lambda (var) (list var ''*unassigned*))
                     (map car bindings))
               (append (map (lambda (var exp) (list 'set! var exp))
                               (map car bindings)
                               (map cadr bindings))
                         body)))))

あとは,いつも通り,evalとprimitive-procedureに追加すればできる.

;;; M-Eval input:
(letrec ((fact (lambda (n)
                 (if (= n 1)
                     1
                     (* n (fact (- n 1)))))))
  (fact 10))

;;; M-Eval value:
3628800
b

日本語がおかしい.

彼の考えは,手続きの内側でdefineが使いたくなければ,letを使うことができる.

彼の考えでは,・・・.

の間違い?

問題の意味がいまいちわからない.一応

  • letでは,評価が行われてしまうので,束縛の評価がその場で行われるので,letrecの代わりにはならない
  • defineでは実際に使うときに,評価が行われる.

こんな感じ?