2011-04-22 183 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