Scheme递归定义的共享环境框架[#56]
program. Scheme 环境查找、扩展与 define 的实现[mce-env]
Defines: (extend-environment lookup define-value!)
Assembled in Scheme 解释器的装配计划, Scheme环境模块
Outputs: metacircular.scm, lp-example/mce/environment.scm
(define (extend-environment names values outer)
(unless (= (length names) (length values)) (throw 'mce-arity names values))
(cons (vector (map cons names values)) outer))
(define (lookup name environment)
(if (null? environment) (throw 'mce-unbound name)
(let ((binding (assq name (vector-ref (car environment) 0))))
(if binding (cdr binding) (lookup name (cdr environment))))))
(define (define-value! name value environment)
(let* ((frame (car environment)) (binding (assq name (vector-ref frame 0))))
(if binding (set-cdr! binding value)
(vector-set! frame 0 (cons (cons name value) (vector-ref frame 0))))))Scheme用户环境是框架链,每个框架保存可变的名字与值关联。闭包捕获框架链,define更新同一个框架,因此递归过程能够查找到自己的binding。框架内的binding使用dotted pair;环境实现保存原文、位置和片段身份,装配到新模块时不继承本文章的词法作用域。