1

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

谢谢~

4

3 回答 3

1

我在这里谈论的是 Common Lisp:

DEFVAR声明一个全局变量并声明它使用动态绑定。它是一个特殊的变量。我们使用*b*它周围的星号作为约定来提醒我们它是一个特殊变量- 它使用动态绑定。任何其他名称都可以。这只是一个约定。在您的示例中,您使用 name b。我不建议这样做。遵循DEFVARas声明的约定和命名变量*b*。同样的规则对DEFPARAMETER.

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

于 2012-08-13T11:03:50.623 回答
0

好的。在 Common Lisp 中,实际上有两种类型的变量:你一直使用的变量,它们是词法绑定的,以及“特殊”变量,它们是动态绑定的。“特殊”变量是用 、 或声明创建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)

如您所见,更改 a 中的特殊变量let的值会使值更改“涓涓细流”到其中的所有函数调用let,而常规的、词法绑定的变量的值更改不会被传递下去,在事实上,词法绑定的变量是通过向上移动函数 wan定义的范围来查找的,而特殊变量是通过向上移动函数被调用的范围来查找的。这*earmuffs*对于阻止程序员意外重新绑定特殊变量很有用,因为它们使特殊变量看起来不同。

于 2012-08-13T13:42:40.953 回答
-1

首先:为了在 Common Lisp 中声明一个“特殊”变量,你必须通过以下方式引入它defvar

(devar *variable* "initial value")

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

于 2012-08-13T11:05:17.430 回答