2011-04-22 149 views
7

变量绑定的问题这是一个关于函数变量绑定问题定义:关于Common Lisp中

如果我定义funcion“总”这样,X在“总”是绑定到让当地X。

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

,但是,如果我定义 “总” 这样,x被绑定到全局x在defvar:

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.Thanks。

回答

6

DEFVAR建立一个符号(这里是X)作为一个动态变量(“特殊”)。一旦完成,它的动态性将由LET和lambda列表保存(这是你总是用* earmuffs *命名特殊变量的原因之一)。因此在第二个例子中,TOTAL中的X将在TOTAL被调用的动态环境中查找。当您在顶层调用它时,它将看到X的顶级绑定,其值为10000.您还可以在另一个LET中调用TOTAL来重新绑定X,并在此期间使用该值:

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

在第一个例子中,X没有被标记为特殊的,所以LET将它与词法相结合,正常。随后的DEFVAR并没有追溯性地影响TOTAL,因为DEFUN已经抓住了LET创建的词汇环境,并且将它用于X的引用(基本上,将它从DEFVAR中隐藏起来)。

+0

感谢您的帮助! – luosha865 2011-04-23 06:50:14