Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
59 lines (51 sloc) 2.13 KB
; 下面首先给出 Alyssa 给出的简化版的 analyze-sequence
(define (analyze-sequence exps)
  (define (execute-sequence procs exp)
    (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的序列求值过程并没有去调用内部建立的各个求值过程,而是循环地通过一个过程去调用它们。从效果上看,虽然序列中的每个表达式都经过了分析,但是整个序列本身却没有分析。

题目说的比较抽象,其实就是说, Alyssa 版本的分析过程直接返回了(lambda (env) (execute-sequence procs env)),在运行时才去展开execute-sequence,而正文给出的版本在分析时就把procs给展开了。

举个例子,假设序列中只有一个表达式E1,解析后的表达式为analyzed-E1,两个版本analyze-sequence分析后的结果是:

; 正文给出的版本的结果
(lambda (env) (analyzed-E1 env))
; Alyssa 给出的版本的结果
(lambda (env) (execute-sequence (analyzed-E1)))

一个的话不是特别明显,我们可以假设序列中有四个表达式:

; 正文给出的版本的结果
(lambda (env)
  ((lambda (env)
     ((lambda (env)
        (proc1 env)
        (proc2 env))
      env)
     (proc3 env))
   env)
  (proc4 env))
; Alyssa 给出的版本的结果
(lambda (env)
  (execute-sequence (proc1 proc2 proc3 proc4) env))