关键字符号
:foo
是关键字符号。
用法
当需要以下属性的组合时使用关键字符号:
- 符号是正确的数据结构
- 具有相同名称的符号应该是唯一的(通过将它们放在一个包中)-> 包
KEYWORD
- 不需要或不需要不同的包 -> 包
KEYWORD
- 编写符号应该很容易,因为不需要引用它们 ->
:foo
比':foo
- 不需要充当具有不同值的变量的能力->对其自身
:foo
进行评估,:foo
并且仅对:foo
在 Common Lisp 中,符号通常可以在一个包中(一种命名空间)。
bar
包中未导出的符号foo
写为foo::bar
. 双冒号位于包名和符号名之间。
然后导出的符号写为foo:bar
。使用单个冒号。
如果符号在当前包中可用,则写为bar
没有包。
包裹KEYWORD
有一个特殊的包叫做KEYWORD
. 该包中的符号bar
简单且始终写为:bar
.
例子
这些关键字符号也有这些有趣的属性:符号是自动从包中导出的KEYWORD
(所以keyword::bar
、keyword:bar
和都是同一个符号)并且它们对自己求值::bar
::bar
CL-USER 5 > :bar
:BAR
CL-USER 6 > (describe :bar)
:BAR is a SYMBOL
NAME "BAR"
VALUE :BAR
FUNCTION #<unbound function>
PLIST NIL
PACKAGE #<The KEYWORD package, 0/4 internal, 5830/8192 external>
CL-USER 7 > (eq 'keyword::bar ':bar)
T
CL-USER 8 > (eq :bar ':bar) ; quoted or unquoted, each subform evaluates to :bar
T
用法
例如,关键字符号用作命名参数中的名称:
(defun foo (&key bar) (+ bar 10))
(foo :bar 7)
通常它们也用于实例和结构构造的参数。
(defstruct node state parent action)
DEFSTRUCT
是一个 Common Lisp 宏,它生成几个函数。其中之一是一个函数MAKE-NODE
,它可以用作:
(make-node :state 'open
:parent some-parent
:action an-action)
注意:有时数据也可能是关键字。例如在上面的形式中,状态可能是:open
而不是open
:
(make-node :state :open
:parent some-parent
:action an-action)