LISP:关键字参数,提供-p

LISP:关键字参数,提供-p,lisp,common-lisp,Lisp,Common Lisp,目前,我正在学习Peter Seibel的“实用公共Lisp” 在“实用:简单数据库”(Practical:A Simple Database)一章中,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) (

目前,我正在学习Peter Seibel的“实用公共Lisp”

在“实用:简单数据库”(Practical:A Simple Database)一章中,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)
因此,如果在参数列表的开头使用&key,则可以使用包含3个参数名称、默认值和第三个参数(如果参数是否已提供)的列表。好啊 但看看上面示例中的代码:

(list a b c c-p)

lisp解释器如何知道c-p是我的“提供的参数”?

很难说出你在问什么
c-p
绑定到
T
NIL
,这取决于
c
是否作为参数提供。该绑定随后可用于函数体。

让我们重新定义函数foo:

如果您像这样缩进它,您将看到该函数有三个关键字参数:a、b和c。这些在函数体中可用

对于关键字参数c,有一个声明为c-p的变量,它将是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)
    
    在这里,默认值和提供的值都可以为零,但我们需要做一些改变。变量init-value-supplied-p可以查看变量init-value的NIL值是来自默认值还是来自函数调用。

    Aaah得到它:-)c-p只是像a、b和c一样添加到列表中,而不是“设置/取消设置列表”的“提供参数”。习惯语法需要一些时间,尽管它非常简单。:-)谢谢
    (make-my-array 10 :init-value nil)