目前我正在通过Peter Seibel的“Practical Common Lisp”工作。
在“实用:简单数据库”(http://www.gigamonkeys.com/book/practical-a-simple-database.html)一章中,Seibel通过以下示例解释了关键字参数和提供参数的用法:
(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是我的“提供的参数”?
答案 0 :(得分:15)
让我们重新启动函数 foo :
(defun foo (&key a
(b 20)
(c 30 c-p))
(list a b c c-p))
如果你这样缩进,你会发现该函数有三个关键字参数:a,b和c。这些可以在函数体中使用。
对于关键字参数 c ,声明 cp 的变量将为T或NIL,具体取决于当foo获取时是否已传递 c 调用。
关键字参数通常可以声明为以下选项之一:
当想要查看值是来自调用还是默认值时,提供的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)
这里默认值和提供的值都可以是NIL,但我们需要有所作为。变量 init-value-supplied-p 使得可以查看变量 init-value 的NIL值是来自默认值还是来自函数调用。
答案 1 :(得分:5)
很难说出你在问什么。 c-p
绑定T
或NIL
,具体取决于c
是否作为参数提供。然后,该绑定可用于函数体。