4.1.3求值器数据结构

来源:互联网 发布:js设置fontsize 编辑:程序博客网 时间:2024/06/07 01:15
;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))))))
0 0
原创粉丝点击