lisp - 为什么静态作用域通常被认为比动态作用域更好?

标签 lisp scheme

我不确定我是否理解正确,为什么在旧版本的 Lisp 中没有实现静态作用域,只有动态作用域。发明 Scheme 的 Sussman 和 Guy L. Steele Jr. 只在 Scheme 中实现了静态作用域。

我发现有时静态变量使用起来更方便,因为它们可以用作完美的状态持有者,尽管我们应该小心避免不希望的名称冲突,因为这是不希望的副作用。

我知道静态作用域是在编译时检测到的,而动态作用域仅在运行时检测到。并且动态范围被认为难以调试,有时甚至难以推理。

如果我们将上述事实放在一边,我不确定我是否理解为什么静态作用域通常被认为比动态作用域更好?

最佳答案

动态作用域的根本问题是它不是组合的,因此违反了抽象。特别是,一段代码(例如,一个函数)的行为通常取决于从哪里调用它,以及在调用者的站点上可以看到哪些定义。因此,调用者必须注意不要定义与被调用者使用的(非本地)名称冲突的名称。因此,调用者必须知道每个被调用者的实现细节。这导致了可怕的模块化。特别是,对函数实现的更改可能会破坏所有调用者。

关于lisp - 为什么静态作用域通常被认为比动态作用域更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029141/

相关文章:

function - 为什么我不能在 Common lisp 中使用从列表中提取的函数符号(#')?

lisp - Lisp Cons Cell 的定义是什么?

visual-studio - 在 Visual Studio 2008 中使用 Ironscheme

javascript - 方案命名空间使用约定。与Javascript相比

scheme - 在Scheme中将AND与apply函数一起使用

scheme - 递归与累加器风格的性能

scheme - 如何在 Racket 中结构复制仅在运行时已知的字段?

lisp - 彩票代码更正

inheritance - 普通 lisp 中的多个构造函数

传递给过程的列表转换为过程内列表的列表