Practice 4.19
(let ((a 1))
(define (f x)
(define b (+ a x))
(define a 5)
(+ a b))
(f 10))
如果在f内部定义b的时引用的a是外部的a,在内部再定义一个a, 有两种方式实现,一种是在当前frame加入新的a的绑定,一种是改变外面a的绑定的 值,第一种在使用a的过程中很依赖先后顺序,容易让人混乱,第二种会给别的引用a的 过程造成副作用,产生预期外的结果。
如果内部定义是同时的,当a、b的定义同时引用对方,而又不是流,就会造成死循环。
所以还是Alyssa的观点比较好,在内部同时定义,但是使用未赋值的变量产生一个错误。
如果不存在互相引用造成无限循环的情况,可以这样实现eva的方案
- 把所有的定义过程找出来
- 给所有变量赋值 unassigned
- 找出其中的不依赖其他未赋值变量的定义过程
- 执行该过程的body,改变当前环境中的变量的值
- 重复以上过程,直到所有定义过程都被执行,或者剩余的定义过程依赖的变量找不到值,产生一个错误