本节是 4.3.3 实现 Amb 求值器 的基础,需要认真理解每一个细节–需要能够写出每一个 analyze 之后最终完整的 lambda 形式的返回值。
本节将解释器中的分析与解释的过程相分离。
这里以
(define (f x) (+ x 1) (+ x 2))
为例解释本节所作的解释器与之前解释器的不同。
analyze 整个调用过程与返回值如下:
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))) 的结果。
(analyze-lambda (lambda (x) (+ x 1) (+ x 2)))
返回:(lambda (env) (make-procedure vars bproc env))
其中:vars 是 ‘(x);bproc 是 (analyze-sequence ‘((+ x 1) (+ x 2))) 的结果。
(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 来运行整个摆设好的代码。