目前我正在学习 Peter Seibel 的“Practical Common Lisp”。
在“实用:一个简单的数据库”一章中(http://www.gigamonkeys.com/book/practical-a-simple-database.html 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))
Results:
(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)
因此,如果我在参数列表的开头使用 &key,则可以使用包含 3 个参数名称、默认值和第三个参数(如果提供或未提供参数)的列表。好的。
但看看上面例子中的代码:
(list a b c c-p)
lisp 解释器如何知道 c-p 是我的“提供的参数”?
让我们重新缩进该函数foo:
(defun foo (&key a
(b 20)
(c 30 c-p))
(list a b c c-p))
如果像这样缩进,您将看到该函数具有三个关键字参数:a、b 和 c。这些可以在函数体中找到。
对于关键字参数c有一个变量声明c-p这将是 T 或 NIL 取决于是否c当 foo 被调用时已经被传递。
关键字参数通常可以声明为以下选项之一:
- 作为单个变量名
- 变量名称和默认值的列表
- 变量名、默认值和调用函数时显示参数是否已传递的变量的列表
当人们想查看该值是来自调用还是来自默认值时,提供的 -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,但我们需要有所区别。变量提供的初始值 p可以查看变量是否为 NIL 值初始值来自默认值或函数调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)