list - Lisp 是如何动态分配符号的? Lisp 符号的底层数据结构/机制?

标签 list dynamic lisp runtime symbols

Lisp 允许您在列表中定义符号,例如 A 和 B

(setf mylist '(+ 1 2 A))

然后您可以随时返回并将 A 设置为一个值,例如。 (设置“A 100”)。此时您可以执行 (eval mylist) 并返回 103。然后您可以重复将 A 重新分配给任何新值。

Lisp 似乎同时保存了文字“A”(符号的名称)和它的赋值。这允许动态变量分配/重新分配。这有点像查找列表。允许这样做的底层数据结构或机制是什么?

编辑:具体来说,这是如何在内部完成的(或外部,因为包似乎直接涉及)?寻找深入的技术答案,着重于它是如何在 Lisp-2 中实现的。

最佳答案

请注意,'(+ 1 2 A) 不是变量,而是计算结果为对象的形式 (quote (+ 1 2 A))。列表中的A是一个符号,但它不是一个变量。

变量是用符号表示的存储位置。

回复:像 Lisp 这样的语言如何在运行时进行这种评估?

(Common) Lisp有两种变量:动态变量和词法变量。可以在运行时评估动态变量,因为您可以获取一个符号并确定它是否具有动态变量绑定(bind),然后检索或分配该绑定(bind)。

词法变量是在编译时“烘焙”的变量:没有可移植的方法来按名称反射(reflect)它们。

两种变量的用途不同。

动态变量可以存储在与符号关联的位置,称为其值单元。 (该术语实际上出现在 ANSI Common Lisp 中)。该符号用作检索单元格(如果有的话)的一种键。例如,值单元格可以是某些存储在哈希表中的 cons 单元格的 cdr 字段,其中键是符号。各种实现都是可能的。

Lisp 支持动态变量的本地重新绑定(bind)有一个复杂性:即您可以使用 let 或其他绑定(bind)结构为隐藏任何现有绑定(bind)的动态变量创建本地绑定(bind)。当构造退出时(以任何方式:包括通过 throw 等非本地退出),隐藏的绑定(bind)将被恢复。这种动态作用域必须以某种方式实现,这意味着动态变量查找不一定只是追逐从符号到值单元格的指针。

更复杂的是,多线程 Lisp 的用户希望每个线程都绑定(bind)动态变量。

这里可能有更多信息:http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Dynamic_scoping

关于list - Lisp 是如何动态分配符号的? Lisp 符号的底层数据结构/机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9948142/

相关文章:

python - python中的列表和文件

python - 如何使用列表理解从列表列表中的 "diagonal"范围创建列表?

python - 在 python 中删除跨多个列表的公共(public)列表元素的最干净方法

c# - 在 C# 中将 Dynamic 和 var 转换为对象

python - 如何将 Lisp 程序的输出转换为 Python?

list - 如何在 lisp 中将列表作为函数参数发送?

lisp - 等价类 LISP

java - 流收集 toMap - 类型不匹配

c# - 生成datalist次数

javascript - 动态创建一个 JavaScript 对象客户端