2010-04-29 30 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