Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗Update the question所以堆栈溢出的值小于aa>。
5年前关闭。
on-topic我对词汇和特殊变量的理解是,词汇变量是“词汇范围内的不确定范围”,而特殊变量是“无限范围的动态扩展。”
我的问题是:“词法和特殊变量”语义一般是如何在引擎盖下实现的?我所说的“一般”是指一个一般的想法就足够了鉴于Lisp的悠久历史,在实现这些基本概念时必须应用许多优化。
为了开始讨论,我在下面大胆猜测。
一切都从环境开始环境是一个帧序列,每个帧是一个将名称映射到位置(其值可以检索和存储)的表;每个这样的映射都是名称到位置的绑定框架通过封闭关系链接;内部框架中的名称可以隐藏外部框架中的相同名称此外,普通LISP中的绑定默认为词法,除非declare -d/declaim -ED/proclaim -ED是特殊的。
语义有两个方面:名称查找和新绑定的创建。
创建新绑定lambda表达式、let/let*labels/fletmacrolet和宏使用它们创建绑定词汇绑定是通过创建一个新的框架并将当前的词汇环境作为新创建的框架的封闭环境来创建的。一个特殊的绑定(必须明确声明)将一个新的位置推到为当前包中的名称创建的堆栈的顶部(堆栈可以用名称上的哈希表来定位)-堆栈用于实现动态范围,以便当构建窗体退出时,绑定可以通过弹出堆栈来解构(问题是,如何确保这样做,可能在引擎盖下面有unwind-protect这样的东西?).
名称查找除非明确声明为特殊,否则名称查找默认通过在绑定创建期间建立的框架链接在词汇环境中查找。查找过程中的第一个匹配名称获胜对于特殊名称(必须显式声明),通过查看堆栈顶部来提供查找。

最佳答案

我认为这个问题可能会迁移到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
此外,对于它的价值,你可能会发现,在编译语言中,词汇环境“查找”实际上不需要很多查找,并且可以编译成一个常量的内存引用到词汇环境中(这仍然是一种查找,但所有的工作都是预先确定的,只需要在运行时进行检索)。

关于lisp - 一般情况下,“词汇和特殊变量”的语义是如何实现的? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18520056/

10-12 01:00