SICP Exercise 4.13

本文深入探讨了make-unbound!函数在编程环境中的作用,特别是其如何仅删除第一个frame中的约束。通过分析代码实现,解释了其与define函数的对应关系,并讨论了封装原则的应用。此外,提供了测试结果来验证实现效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;; Exercise 4.13

我认为make-unbound!应该只删除第一个frame里面的约束。我的原因有一下几点:

1,make-unbound!和define对应,前者是删除约束,而后者是添加约束(有时是改变已有的约束)。define是在第一个frame中定义约束,所以make-unbound!也应该是从第一个框架中删除约束。

2,根据封装的原则,不应该在当前environment中删除第一个frame之外的约束。

下面假设我们的eval是data-driven的方式实现的(参加exercise 4.3)。

;; Exercise 4.13

(define (unbound-var-in-frame! var frame)
  (let  ((new-vars '())
        (new-vals '()))
    (define (scan vars vals)
      (cond ((null? vars) 'done)
            ((eq? var (car vars)) 
             (scan (cdr vars) (cdr vals)))
            (else
             (begin
               (set! new-vars (cons (car vars) new-vars))
               (set! new-vals (cons (car vals) new-vals))
               (scan (cdr vars) (cdr vals))))))
    (scan (frame-variables frame)
          (frame-values frame))
    (set-car! frame new-vars)
    (set-cdr! frame new-vals)
    'ok))

(define (eval-make-unbound! exp env)
  (unbound-var-in-frame! (cadr exp) (first-frame env)))

(put 'make-unbound! eval-make-unbound!)

下面是测试结果:

;;; M-Eval input:
(define a 1)

;;; M-Eval value:
ok

;;; M-Eval input:
(define b 2)

;;; M-Eval value:
ok

;;; M-Eval input:
(make-unbound! b)

;;; M-Eval value:
ok

;;; M-Eval input:
a

;;; M-Eval value:
1

;;; M-Eval input:
b
. . data_structure.rkt:55:8: Unbound variable b


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值