;4.12,这里的用了一个通用的在框架中寻找变量的过程,不过这个过程不能用在4.13中的make-unbound!里
(define (lookup-var-in-frame var vars vals)
(cond ((null? vars) false)
((eq? var (car vars)) (cons vars vals))
(else (lookup-var-in-frame var (cdr vars) (cdr vals)))))
(define (set-variable-value!-2 var val env)
(if (eq? env the-empty-environment)
(error "Unbound variable -- SET!" var)
(let ((frame (first-frame env)))
(let ((result (lookup-var-in-frame
var
(frame-variables frame)
(frame-values frame))))
(if result
(set-car! (cdr result) val)
(set-variable-value!-2
var val
(enclosing-environment env)))))))
(define (define-variable! var val env)
(let* ((frame (first-frame env))
(result (lookup-var-in-frame var
(frame-variables frame)
(frame-values frame))))
(if result
(set-car! (cdr result) val)
(add-binding-to-frame! var val frame))))
(define (lookup-variable-value-2 var env)
(if (eq? env the-empty-environment)
(error "Unbound variable" var)
(let ((frame (first-frame env)))
(let ((result (lookup-var-in-frame
var
(frame-variables frame)
(frame-values frame))))
(if result
(cadr result)
(lookup-variable-value-2
var
(enclosing-environment env)))))))
;4.13没有必要删除外围环境中的约束
(define (make-unbound! var env)
(let* ((frame (first-frame env))
(vars (frame-variables frame))
(vals (frame-values frame)))
(define (scan pre-vars pre-vals vars vals)
(if (not (null? vars))
(if (eq? var (car vars))
(begin (set-cdr! pre-vars (cdr vars))
(set-cdr! pre-vals (cdr vals)))
(scan vars vals (cdr vars) (cdr vals)))))
(if (not (null? vars))
(if (eq? var (car vars))
(begin (set-car! frame (cdr vars))
(set-cdr! frame (cdr vals)))
(scan vars vals (cdr vars) (cdr vals))))))
4.1.3求值器数据结构
最新推荐文章于 2020-12-05 15:41:34 发布