gpt4 book ai didi

lisp - 关于common lisp中变量绑定(bind)的问题

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

关于函数定义中变量绑定(bind)的问题:

如果我像这样定义函数“total”,“total”中的 x 将绑定(bind)到 let 中的本地 x。

CL-USER> (let ((x 0))
(defun total (y)
(incf x y)))
TOTAL
CL-USER> (defvar x 10000)
X
CL-USER> (total 1)
1

但是,如果我这样定义“total”,x 将绑定(bind)到 defvar 中的全局 x:

CL-USER> (defvar x 10000) 
X
CL-USER> (let ((x 0))
(defun total (y)
(incf x y)))
TOTAL
CL-USER> (total 1)
10001

这是为什么?我需要一个解释来理解它。环境是windows+emacs+slime+sbcl。谢谢。

最佳答案

DEFVAR 将符号(此处为 X)确定为动态变量(“特殊”)。一旦完成,它的动态性将由 LET 和 lambda 列表保留(这就是为什么你总是用 *earmuffs* 命名特殊变量的原因之一)。因此在第二个示例中,将在调用 TOTAL 的动态环境中查找 TOTAL 中的 X。当您在顶层调用它时,它会看到 X 的顶层绑定(bind),其中它的值为 10000。您还可以在另一个重新绑定(bind) X 的 LET 中调用 TOTAL,它将在持续时间内使用该值:

* (let ((x 1000))    (total 5)))1005* (total 1)10002

在第一个例子中,X 没有被标记为特殊的,所以 LET 像往常一样在词法上绑定(bind)它。随后的 DEFVAR 不会追溯影响 TOTAL,因为 DEFUN 已经获取了 LET 创建的词法环境,并将使用它作为对 X 的引用(基本上,对 DEFVAR 隐藏它。)

关于lisp - 关于common lisp中变量绑定(bind)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5752933/

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