【问题标题】:LISP: Keyword parameters, supplied-pLISP:关键字参数,提供-p
【发布时间】:2011-02-13 17:29:57
【问题描述】:

目前我正在研究 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 是我的“提供的参数”?

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

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

    【讨论】:

    • Aaah 明白了 :-) c-p 只是像 a、b 和 c 一样添加到列表中,而不是“设置/取消设置列表”的“提供参数”。习惯语法需要一些时间,尽管它真的很容易。 :-) 谢谢!
    【解决方案2】:

    让我们重新缩进函数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调用。

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

    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)
    

    这里的默认值和提供的值都可以是 NIL,但我们需要有所不同。变量 init-value-supplied-p 可以查看变量 init-value 的 NIL 值是来自默认值还是来自函数调用。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多