代码之家  ›  专栏  ›  技术社区  ›  echox Petter Nordlander

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

  •  10
  • echox Petter Nordlander  · 技术社区  · 16 年前

    目前我正在学习Peter Seibel的“实用公共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是我的“提供的参数”?

    2 回复  |  直到 16 年前
        1
  •  15
  •   Rainer Joswig mmmmmm    16 年前

    让我们重新定义函数 :

    (defun foo (&key a
                     (b 20)
                     (c 30 c-p))
       (list a b c c-p))
    

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

    对于关键字参数 声明了一个变量 c-p公司 这将是T还是NIL取决于 c

    1. 作为单个变量名
    2. 变量名和默认值的列表

    当需要查看值是来自调用还是来自默认值时,提供的-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初始值 可以查看变量的NIL值 初始值 来自默认值或函数调用。

        2
  •  5
  •   Marcelo Cantos    16 年前

    很难说出你在问什么。 c-p T 或 NIL c