Common Lisp中变量前面的冒号是什么意思?我已经看过这样的程序,并且我将在这里提供一些示例代码,这些代码来自大量函数。
(defun expand (successorf node)
(mapcar (lambda (action-state-cost)
(let ((action (car action-state-cost))
(state (cadr action-state-cost))
(cost (caddr action-state-cost)))
(make-node :state state :parent node
:action action :path-cost (+ (node-path-cost node) cost)
:depth (1+ (node-depth node)))
))
(funcall successorf (node-state node))
))
答案 0 :(得分:31)
关键字符号
:foo
是 keyword符号。
KEYWORD
包<强>用法强>
当需要以下属性的组合时,使用关键字符号:
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)
答案 1 :(得分:19)