gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:27 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com