乐正

Actions speak louder than words.

Sicp-ex4-13

问题

Scheme 允许我们通过define为变量创建新的约束,但却没有提供消除约束的方式。请为求值器实现一个特殊形式make-unbound!,它能从make-unbound!表达式求值的哪个环境中删除给定的符号的约束。这一问题完全没有刻画清楚。例如,我们应该只删除环境中第一个框架里的约束吗?请完成有关的规范,并说明你所做选择的合理性。

解答

应该只删除第一个框架里的约束。因为其他框架可能是另一段程序上下文环境。如果第一个框架里面没有,从而去别的框架中寻找变量然后删除,那么会造成在退出当前环境时,别的程序执行会因为没有相关变量而出现错误。

实现如下:

练习4.13 (ex4-13.scm) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(define (make-unbound! var env)
  (let ((frame (frist-frame env))
        (define (scan vars vals new-vars new-vals)
          (cond ((null? vars)
                 (make-frame new-vars new-vals))
                ((eq? var (cdr vars))
                 (scan vars vals new-vars new-vals))
                (else (scan (cdr vars)
                            (cdr vals)
                            (cons (car vars) new-vars)
                            (cons (cdr vals) new-vals)))))
        (set-car! env (scan (frame-variables frame)
                            (frame-values frame)
                            '()
                            '()))
        'done)))

draft

« sicp-ex4-12 sicp-ex4-14 »

Comments