在 Common Lisp 中,命名参数被称为关键字参数。
关键字参数由 lambda 列表中的&key lambda 列表关键字来指定。关键字参数不是必需的,可以有默认值,也可以指定一个“supplied-p 参数”,它的值是“true”还是“false”,取决于是否给该参数传入了实参。
(defun keyword-parameter (&key (arg -1) arg)
(keyword-parameter) ; => -1
(keyword-parameter :arg 13) ; => 13
在传给函数的实参中,关键字参数通过它们的“关键字名”来指定。默认情况下,关键字名是参数名的关键字符号形式(也就是说,关键字参数 name 的关键字名是 :name)。也可以用一个由关键字名和参数名组成的列表来代替单独的参数名,从而为关键字参数指定另一个名字:
(defun other-keyword-name (&key ((other-name arg))) (list arg))
(other-keyword-name 'other-name 5) ; => (5)
虽然多种类型的参数可以与其他类型的参数(可选参数和关键字参数)组合使用,但这样做可能会出现问题,应当谨慎处理。 参见《Practical Common Lisp》中关于"混用不同的参数类型"的一节。