lisp - 一般来说, "lexical and special variable"语义是如何在幕后实现的?

标签 lisp common-lisp lexical-scope special-variables

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












这个问题似乎与 help center 中定义的范围内的编程无关。 .


8年前关闭。







Improve this question




CLtL2 has clarified the distinction between scope and extent .关于词法变量和特殊变量,我的看法是,词法变量是“具有无限范围的词法作用域”,而特殊变量是“具有动态扩展的无限作用域”。

我的问题是:一般来说,“词汇和特殊变量”语义是如何在幕后实现的? 我所说的“一般”是指一个一般的想法就足够了。鉴于 Lisp 的悠久历史,必须有许多优化已应用于实现这些基本概念。

为了启动讨论,我在下面大胆猜测。

一切都从环境开始。环境是一系列帧,每个帧都是一个将名称映射到位置的表(可以检索和存储其值);每个这样的映射都是一个名字到一个地方的绑定(bind)。框架通过封闭关系链接;内部框架中的名称可以覆盖外部框架中的相同名称。此外,Common Lisp 中的绑定(bind)默认是词法的,除非 declare -d/declaim -ed/proclaim -ed是特别的。

语义有两个方面:名称查找和新绑定(bind)的创建。

  • 创建一个新的绑定(bind)。 lambda表达式,let/let* , labels/flet , macrolet , 和使用它们的宏创建绑定(bind)。词法绑定(bind)是通过创建一个新框架并使当前词法环境成为新创建的框架的封闭环境来创建的。一个特殊的绑定(bind)(必须显式声明)将一个新位置推到为当前包中的名称创建的堆栈顶部(堆栈可以通过名称上的哈希表定位)——堆栈用于实现动态范围,以便在构造表单退出时,可以通过弹出堆栈来解构绑定(bind)(问题是如何确保如此,也许在引擎盖下使用 unwind-protect 之类的东西?)。
  • 名称查找。除非明确声明为特殊,否则名称查找默认为在词法环境中查找——通过在绑定(bind)创建期间建立的框架链接。查找过程中第一个匹配的名称获胜。对于特殊名称(必须明确声明),查找是通过查看堆栈顶部来提供的。
  • 最佳答案

    我认为这个问题可能会迁移到 programmers.stackexchange.com ,但是 StackOverflow 上还有一些其他问题可以提供其中一些问题的答案,尽管到目前为止我发现没有一个是完全重复的。看一下:

  • How is Lexical Scoping implemented?
  • Is it possible to have hard real-time with lexical scope?
  • Lexical vs dynamic scoping in terms of SICP's Environment Model of Evaluation

  • 另外,不管它的值(value),你可能会发现在编译语言中,词法环境“查找”实际上不需要太多的查找,并且可以编译成对词法环境的恒定时间内存引用(这仍然是一种查找,但所有工作都是事先确定的,只有检索需要在运行时进行)。

    关于lisp - 一般来说, "lexical and special variable"语义是如何在幕后实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520056/

    相关文章:

    list - 从 Lisp 列表中删除双元素

    scheme - 在返回列表的函数中获取列表的反向

    common-lisp - defmethod 和 defun 的 Common Lisp 特殊变量范围不同?

    javascript - 有TDZ为什么要提升变量

    lisp - 反引号扩展列表中的一系列元素

    merge - 关于 Common Lisp 中的 MERGE 函数

    common-lisp - setf函数和函数的区别

    javascript - 为什么在 ES5 中变量对象被改为词法环境?

    javascript - JS - 在外部函数之外声明嵌套函数

    list - 只是试图递归地打印一个列表,但没有打印