关键词符号
:foo
is a keyword http://www.lispworks.com/documentation/HyperSpec/Body/t_kwd.htm#keyword symbol.
- 实习并从
KEYWORD
package
- 不断地束缚于自身
Usage
当需要以下属性的组合时,使用关键字符号:
- 符号是正确的数据结构
- 具有相同名称的符号应该是唯一的(通过将它们驻留在包中)->包
KEYWORD
- 不需要或想要不同的包 -> 包
KEYWORD
- 编写符号应该很容易,不需要引用它们 ->
:foo
比':foo
- 不需要充当具有不同值的变量的能力 ->
:foo
评估为:foo
本身并且只为了:foo
在 Common Lisp 中,符号通常可以位于包中(一种命名空间)。
未导出的符号bar
在一个包中foo
写成foo::bar
。双冒号位于包名称和符号名称之间。
导出的符号则写为foo:bar
。使用单个冒号。
如果该符号在当前包中可用,则写为bar
没有包裹。
套餐KEYWORD
有一个特殊的包叫KEYWORD
。一个符号bar
在该包中简单且始终写为:bar
.
Examples
这些关键字符号还具有这些有趣的属性:符号会自动从包中导出KEYWORD
(so keyword::bar
, keyword:bar
, ::bar
and :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
Usage
例如,关键字符号用作命名参数中的名称:
(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)