SICP 全笔记

本节是 4.3.3 实现 Amb 求值器 的基础,需要认真理解每一个细节–需要能够写出每一个 analyze 之后最终完整的 lambda 形式的返回值。

本节将解释器中的分析与解释的过程相分离。

这里以

(define (f x) (+ x 1) (+ x 2))

为例解释本节所作的解释器与之前解释器的不同。

analyze 整个调用过程与返回值如下:

  1. analyze-definition (define (f x) (+ x 1) (+ x 2))

    返回: (lambda (env) (define-variable! var (vproc env) env))

    其中:var 是 f;vproc 是 (analyze-lambda (lambda (x) (+ x 1) (+ x 2))) 的结果。

  2. (analyze-lambda (lambda (x) (+ x 1) (+ x 2)))

    返回:(lambda (env) (make-procedure vars bproc env))

    其中:vars 是 ‘(x);bproc 是 (analyze-sequence ‘((+ x 1) (+ x 2))) 的结果。

  3. (analyze-sequence ‘((+ x 1) (+ x 2)))

    返回:(lambda (env) “((+ x 1) (+ x 2))的sequence”)

    其中:“((+ x 1) (+ x 2))的sequence” 是一个复杂的表达式,具体分析可以见 练习 4.23

在第三点中返回的 sequence 其实是:

(lambda (env)
  ((lambda (env)
     (execute-application (lambda (env) (lookup-variable-value '+ env))
                          (map (lambda (aproc) (aproc env))
                               ((lambda (env) (lookup-variable-value 'x env))
                                (lambda (env) 1)))))
   env)
  ((lambda (env)
     (execute-application (lambda (env) (lookup-variable-value '+ env))
                          (map (lambda (aproc) (aproc env))
                               ((lambda (env) (lookup-variable-value 'x env))
                                (lambda (env) 2)))))
   env))

从上面的分析可以看出,整个 analyze 过程实际已经把程序完全摆设好,只等最终的 lambda 式子传入一个 env 来运行整个摆设好的代码。