4.1.3求值器数据结构

;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))))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值