2012-08-13 150 views
1

在一些文档中,我发现他们说的答案是*var*意味着全局变量。使用defvar时* var *和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*

谢谢〜

回答

0

好的。在Common Lisp中,实际上有两种类型的变量:所有时间使用的变量,它们是词法绑定的,以及“特殊”变量,它们是动态绑定的。使用defvar,defparameter或声明创建“特殊”变量。 *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调用,而值变化常规的词汇绑定变量不会被传递下来,实际上,通过向上移动位于函数wan 定义的范围的范围来查找词汇绑定变量,而通过向上移动范围来查找特殊变量功能是,称为*earmuffs*对于阻止程序员意外重新绑定特殊变量很有用,因为它们使特殊变量看起来不同。

1

我谈论Common Lisp的位置:

DEFVAR声明了一个全局变量,并声明它使用动态绑定。它是一个特殊变量。我们使用带有星号的*b*作为约定,以提醒我们这是一个特殊变量 - 它使用动态绑定。任何其他名称都可以。这只是一个约定。在你的例子中,你使用名字b。我不会推荐。请遵循DEFVAR声明的约定和名称变量作为*b*。相同的规则对于DEFPARAMETER有用。

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

+0

我知道C++中的动态绑定。 lisp中的动态绑定是什么?他们有多相似?谢谢〜 – sam 2012-08-13 12:18:18

+0

@sam我怀疑“不是很多”。在Common Lisp中,它是动态变量查找与静态变量查找。在C++中,这是一个vtable调度与编译时确定方法。 – Vatine 2012-08-13 12:37:57

+0

@sam:动态绑定在很多地方都有解释。 Lisp书籍就是这样做的。一个简单的谷歌搜索将带来很多点击... – 2012-08-13 13:50:08

-1

第一关:以宣布在Common Lisp的一个“特殊”的变量,你必须通过defvar来介绍它:

(devar *variable* "initial value") 

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

+2

其实,我认为你所需要的只是宣布它是特殊的,然后设定它的价值。 – Vatine 2012-08-13 12:33:55

相关问题