Lisp 什么';使用defvar时,*var*和var之间的区别是什么?

Lisp 什么';使用defvar时,*var*和var之间的区别是什么?,lisp,common-lisp,Lisp,Common Lisp,在一些文档中,我发现他们说答案是*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仍

在一些文档中,我发现他们说答案是
*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:

DEFVAR
声明一个全局变量并声明它使用动态绑定。它是一个特殊的变量。我们使用带星号的
*b*
作为惯例,提醒我们它是一个特殊变量,它使用动态绑定。其他名字都行。这只是一个惯例。在您的示例中,使用名称
b
。我不建议这样做。遵循约定,将由
DEFVAR
声明的变量命名为
*b*
。同样的规则适用于
DEFPARAMETER


你的例子是什么意思还不清楚。当然,您可以在函数中使用全局变量。

首先:为了在Common Lisp中声明“特殊”变量,您必须通过
defvar
引入它:

(devar *variable* "initial value")

变量名周围的“耳罩”(
*
)仅仅是一种惯例,它告诉读者变量是特殊的。这与告诉编译器变量是特殊的无关。请注意,
*
字符是变量名称的一部分(是的,Common Lisp允许在符号名称中使用
*
——以及一大堆其他“不寻常”字符)

好的。在CommonLisp中,实际上有两种类型的变量:一直使用的变量,它们是词汇绑定的,和“特殊”变量,它们是动态绑定的。“特殊”变量是通过
defvar
defparameter
或声明创建的。
*耳罩*
是一种惯例,用来提醒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
中所有函数调用的值更改“滴流”,而常规的、词汇绑定的变量的值更改实际上不会向下传递,词汇绑定变量是通过向上移动位于定义函数wan的范围来查找的,而特殊变量是通过向上移动调用函数的范围来查找的。<代码> *耳罩*/COM>有助于阻止程序员意外地重新绑定一个特殊的变量,因为它们使特殊的变量看起来不同。

我知道C++中的动态绑定。lisp中的动态绑定是什么?它们有多相似?谢谢~@sam我想“不太可能”。在公共Lisp中,它是动态变量查找,而不是静态变量查找。在C++中,它是一个VTABLE调度与编译时方法的确定。@山姆:动态绑定在很多地方都有解释。口齿不清的书可以做到这一点。一个简单的谷歌搜索会带来很多点击率…事实上,我认为你所需要的只是声明它是特殊的,然后设置它的值。