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
包中插入和导出用法
当需要以下属性的组合时,使用关键字符号:
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
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描述了函数调用的语法.