关闭。这个问题不符合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)的创建。
lambda
表达式,let
/let*
, labels
/flet
, macrolet
, 和使用它们的宏创建绑定(bind)。词法绑定(bind)是通过创建一个新框架并使当前词法环境成为新创建的框架的封闭环境来创建的。一个特殊的绑定(bind)(必须显式声明)将一个新位置推到为当前包中的名称创建的堆栈顶部(堆栈可以通过名称上的哈希表定位)——堆栈用于实现动态范围,以便在构造表单退出时,可以通过弹出堆栈来解构绑定(bind)(问题是如何确保如此,也许在引擎盖下使用 unwind-protect
之类的东西?)。 最佳答案
我认为这个问题可能会迁移到 programmers.stackexchange.com ,但是 StackOverflow 上还有一些其他问题可以提供其中一些问题的答案,尽管到目前为止我发现没有一个是完全重复的。看一下:
另外,不管它的值(value),你可能会发现在编译语言中,词法环境“查找”实际上不需要太多的查找,并且可以编译成对词法环境的恒定时间内存引用(这仍然是一种查找,但所有工作都是事先确定的,只有检索需要在运行时进行)。
关于lisp - 一般来说, "lexical and special variable"语义是如何在幕后实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520056/