我不确定我是否理解正确,为什么在旧版本的Lisp中没有实现静态作用域,只有动态作用域.已经发明了Scheme的Sussman和Guy L. Steele Jr.只实现了静态范围.
我发现有时静态变量使用起来更方便,因为它们可以用作完美的状态持有者,尽管我们应该小心避免不希望的名称冲突,因为这是不希望的副作用.
我知道在编译期间检测到静态作用域,而动态作用域仅在运行时检测到.并且动态范围被认为是难以dubug,有时是为了推理.
如果我们把上面提到的事实放在一边,我不确定我理解为什么静态范围通常被认为比动态范围更好?
动态范围的根本问题在于它不是组合的,因此违反了抽象.特别是,一段代码(比如一个函数)的行为通常取决于它的调用位置,以及调用者站点可见的定义.因此,调用者必须小心不要定义与被调用者使用的(非本地)冲突的名称.因此,调用者必须知道每个被调用者的实现细节.这造成了可怕的模块化.特别是,对函数实现的更改可能会破坏所有调用者.