gpt4 book ai didi

lisp - 使用 defvar 时 *var* 和 var 有什么区别?

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

在一些文档中,我发现他们说答案是 *var* 表示全局变量。

但是当我尝试时,我无法确定这一点。

  FIRST-PACKAGE[27]> (defvar b 1)
B
FIRST-PACKAGE[28]> b
1
FIRST-PACKAGE[29]> (defun add_b (x) (+ x b))
ADD_B
FIRST-PACKAGE[30]> (add_b 3)
4
FIRST-PACKAGE[31]>

在我的示例中,如果答案正确,b 仍然不是全局的。

但是为什么函数add_b还能用呢?

如何理解这个例子和*var*

谢谢~

最佳答案

好的。在 Common Lisp 中实际上有两种类型的变量:一种是你一直使用的变量,它们是词法绑定(bind)的,另一种是“特殊”变量,它们是动态绑定(bind)的。 “特殊”变量是使用 defvardefparameter 或声明创建的。 *earmuffs* 是一种约定,用于提醒 Lisp 程序员变量是特殊的。以下是一些示例:

(defvar b 3)

(defun add-to-b (x)
(+ x b))

(add-to-b 1)
=> 4

(let ((b 4))
(list (add-to-b 1) b))
=> (5 4)

(let ((a 3))
(defun add-to-a (x)
(+ x a)))

(add-to-a 1)
=> 4

(let ((a 4))
(list (add-to-a 1) a))
=> (4 4)

如您所见,更改 let 中特殊变量的值会使值更改“滴流”到该 let 中的所有函数调用,虽然常规词法绑定(bind)变量的值更改不会向下传递,但实际上,词法绑定(bind)变量是通过向上移动位于函数 wan 定义 的范围来查找的,而特殊通过向上移动调用函数的范围来查找变量。 *earmuffs* 可用于阻止程序员意外重新绑定(bind)特殊变量,因为它们使特殊变量看起来不同。

关于lisp - 使用 defvar 时 *var* 和 var 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11932876/

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