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

标签 lisp common-lisp

目前我正在学习 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)

因此,如果我在参数列表的开头使用 &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 获取时是否已传递打电话。

关键字参数通常可以声明为以下选项之一:

  1. 作为单个变量名
  2. 变量名和默认值的列表
  3. 一个变量名、默认值和一个变量的列表,该变量将在调用函数时显示参数是否已传递

当想要查看值是来自调用还是默认值时,supplied-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 值是来自默认值还是来自函数调用。

关于LISP:关键字参数,提供-p,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2736037/

相关文章:

macros - 方案;宏列表中的错误漏洞

common-lisp - sbcl:将(无符号字节 32)转换为单 float

lisp - 谓词 Common Lisp

string - 字符串处理中Lisp性能优化方案

Clojure let 与 Common Lisp let

Emacs 口齿不清 : make newly-created buffer visible before the function returns?

lisp - 从另一个包调用时,sublis 不替换符号

lisp - Lisp 和 Scheme 中的 WebSockets 库?

function - 从 lisp 中的整数列表中消除每次出现的 x

vector - 给定向量列表的质心