我不确定我是否理解正确,为什么在旧版本的 Lisp 中没有实现静态作用域,只有动态作用域。发明 Scheme 的 Sussman 和 Guy L. Steele Jr. 只在 Scheme 中实现了静态作用域。
我发现有时静态变量使用起来更方便,因为它们可以用作完美的状态持有者,尽管我们应该小心避免不希望的名称冲突,因为这是不希望的副作用。
我知道静态作用域是在编译时检测到的,而动态作用域仅在运行时检测到。并且动态范围被认为难以调试,有时甚至难以推理。
如果我们将上述事实放在一边,我不确定我是否理解为什么静态作用域通常被认为比动态作用域更好?
最佳答案
动态作用域的根本问题是它不是组合的,因此违反了抽象。特别是,一段代码(例如,一个函数)的行为通常取决于从哪里调用它,以及在调用者的站点上可以看到哪些定义。因此,调用者必须注意不要定义与被调用者使用的(非本地)名称冲突的名称。因此,调用者必须知道每个被调用者的实现细节。这导致了可怕的模块化。特别是,对函数实现的更改可能会破坏所有调用者。
关于lisp - 为什么静态作用域通常被认为比动态作用域更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029141/