cyb*_*nzy 16 syntax common-lisp colon
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))
))
Run Code Online (Sandbox Code Playgroud)
Rai*_*wig 32
关键字符号
:foo是一个关键字符号.
KEYWORD包中插入和导出用法
当需要以下属性的组合时,使用关键字符号:
KEYWORDKEYWORD: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
Run Code Online (Sandbox Code Playgroud)
用法
关键字符号例如用作命名参数中的名称:
(defun foo (&key bar) (+ bar 10))
(foo :bar 7)
Run Code Online (Sandbox Code Playgroud)
通常,它们也用于实例和结构构造的参数.
(defstruct node state parent action)
Run Code Online (Sandbox Code Playgroud)
DEFSTRUCT是一个Common Lisp宏,它生成几个函数.其中一个是函数MAKE-NODE,可以用作:
(make-node :state 'open
:parent some-parent
:action an-action)
Run Code Online (Sandbox Code Playgroud)
注意:有时数据也可能是关键字.例如,在上面的形式中,状态可能是,:open而不是open:
(make-node :state :open
:parent some-parent
:action an-action)
Run Code Online (Sandbox Code Playgroud)
BRP*_*ock 19
实际上,它们不是变量; 那些是关键词.它们是一种特殊的有效标记,类似于其他语言中的"原子".这是一种方便的内置方法,可以将命名(和几乎总是可选的)参数传递给函数调用.
http://www.gigamonkeys.com/book/functions.html描述了函数调用的语法.