为什么冒号位于Common Lisp中的变量之前

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描述了函数调用的语法.