演習問題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では実際に使うときに,評価が行われる.
こんな感じ?