« 今日の日記 | Main | 4.3 Variations on a Scheme -- Nondeterministic Computing »

2007.09.10

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へ再挑戦。

ソースはここ

|

« 今日の日記 | Main | 4.3 Variations on a Scheme -- Nondeterministic Computing »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/16405354

Listed below are links to weblogs that reference SICP 4.1.7 Separating Syntactic Analysis from Execution:

« 今日の日記 | Main | 4.3 Variations on a Scheme -- Nondeterministic Computing »