SICP 4.1.7 Separating Syntactic Analysis from Execution
先にanalyzeして効率を良くする話。トレードオフでデバッグのしやすさという大事なものを失った。
Exercise 4.22
letは手続きの生成、呼び出しのシンタックスシュガー。let->combinationでletを手続き呼び出しに変えた後は、教科書に載っている範囲で処理できるから、そのままanalyzeに渡せる。
(define (analyze exp)
(cond ((self-evaluating? exp)
(analyze-self-evaluating exp))
((quoted? exp) (analyze-quoted exp))
((variable? exp) (analyze-variable exp))
((assignment? exp) (analyze-vairable exp))
((definition? exp) (analyze-definition exp))
((if? exp) (analyze-if exp))
((let? exp) (analyze-let exp)) ; 追加
((lambda? exp) (analyze-lambda exp))
((begin? exp) (analyze-sequence (begin-actions exp)))
((cond? exp) (analyze (cond->if exp)))
((application? exp) (analyze-application exp))
(else
(error "Unkown expression type nyo ANALYZE" exp))))
(define (analyze-let exp)
(let ((proc (analyze (let->combination exp))))
(lambda (env)
(proc env))))
でOK。condも同じでいけそうだ。
ambへ再挑戦。
ソースはここ
The comments to this entry are closed.


Comments