2010-04-29 62 views
9

目前我正在通過Peter Seibel的「Practical Common Lisp」進行工作。LISP:關鍵字參數,提供 - p

在章節「實用:一個簡單的數據庫」(http://www.gigamonkeys.com/book/practical-a-simple-database.html)塞貝爾解釋關鍵字參數和一個供給參數的用下面的例子使用:

(defun foo (&key a (b 20) (c 30 c-p)) (list a b c c-p)) 

結果:

(foo :a 1 :b 2 :c 3) ==> (1 2 3 T) 
(foo :c 3 :b 2 :a 1) ==> (1 2 3 T) 
(foo :a 1 :c 3)  ==> (1 20 3 T) 
(foo)     ==> (NIL 20 30 NIL) 

因此,如果我在參數列表的開頭使用&鍵,則可以使用3個參數名稱的列表,缺省值和第三個參數(如果參數已提供)。好。 但是在上面的例子看代碼:

(list a b c c-p) 

怎樣的Lisp解釋知道C-p是我的「提供的參數」?

回答

14

讓我們再次縮進功能

(defun foo (&key a 
       (b 20) 
       (c 30 c-p)) 
    (list a b c c-p)) 

如果縮進像這樣,你會看到該函數有三個關鍵字參數:a,b和c。這些可在函數的主體中找到。

對於關鍵字參數Ç有一個變量聲明C肽,這將是T或取決於是否Ç FOO時被調用已經通過NIL。

關鍵字參數通常可以被聲明爲以下選項之一:

  1. 作爲一個單一的變量名
  2. 變量名的列表和默認值
  3. 的變量的列表名稱,一個默認值和一個變量,當函數被調用時將顯示參數是否已通過

提供的p特別有趣,當一個希望看到值是否來自於呼叫或默認值:

(defun make-my-array (size &key (init-value nil init-value-supplied-p)) 
    (if init-value-supplied-p 
     (make-array size :initial-element init-value) 
     (make-array size))) 

現在,用戶可以初始化的元素NIL:

(make-my-array 10 :init-value nil) 

這裏的默認值和所提供的價值都可以是無,但我們需要有所作爲。變量init-value-supplied-p使得可以查看變量初始值的NIL值是否來自默認或來自函數調用。

5

很難說出你在問什麼。 c-p綁定到TNIL,這取決於是否提供c作爲參數。該綁定隨後可用於該函數的主體。

+1

Aaah明白了:-) c-p只是簡單地添加到列表中,如a,b和c,而不是「列表已設置/未設置」的「提供參數」。 雖然它很簡單,但它仍然需要一些時間才能熟悉語法。 :-) 謝謝! – echox 2010-04-29 09:25:58