SICPゼミ第51回

ご無沙汰しております

練習問題4.23

  • Alyssaの解析器
(define (analyze-sequence exps)
  (define (execute-sequence procs env)
    (cond (( null? (cdr procs ))
           ((car procs) env))
          (else
            ((car procs) env)
            (execute-sequence (cdr procs) env ))))
  (let (( procs (map analyze exps )))
    (if (null? procs)
        (error "Empty sequence: ANALYZE"))
    (lambda (env)
      (execute-sequence procs env ))))
  • 本文中の解析器
(define (analyze-sequence exps)
  (define (sequentially proc1 proc2)
    (lambda (env) (proc1 env) (proc2 env )))
  (define (loop first-proc rest-procs)
    (if (null? rest-procs)
        first-proc
        (loop (sequentially first-proc (car rest-procs ))
              (cdr rest-procs ))))
  (let (( procs (map analyze exps )))
    (if (null? procs) (error "Empty sequence: ANALYZE"))
    (loop (car procs) (cdr procs ))))

Alyssaの解析器では字句解析を(map analyze exps)で行っていて、構文解析expecute-sequenceで行っているが、analyze-sequenceで返ってくるのはlambda式なので、lambdaが実行されるまで構文解析が行われない。
それに対して本文中の解析器はanalyze-sequenceの段階で構文解析まで行っている。

練習問題4.24

お気持ち