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

时间:2011-12-19 20:31:02

标签: 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))
      ))

2 个答案:

答案 0 :(得分:31)

关键字符号

:foo keyword符号

  • KEYWORD
  • 实习并导出
  • 不断与自己联系

<强>用法

当需要以下属性的组合时,使用关键字符号:

  • 符号是正确的数据结构
  • 具有相同名称的符号应该是唯一的(通过在包中实现它们) - &gt;包KEYWORD
  • 不需要或不需要不同的包裹 - &gt;包KEYWORD
  • 写这个符号应该很容易,不需要引用它们 - &gt; :foo优于':foo
  • 不需要充当具有不同值的变量的能力 - &gt; :foo评估为:foo本身,仅评估为:foo

在Common Lisp中,通常符号可以在包中(类型名称空间)。

bar中未导出的符号foo写为foo::bar。双冒号位于包名称和符号名称之间。

然后,导出的符号将写为foo:bar。使用单个冒号。

如果符号在当前包中可用,则写入bar而不包装。

KEYWORD

有一个名为KEYWORD的特殊包。该包中的符号bar简单且始终写为:bar

<强>实施例

这些关键字符号也有这些有趣的属性:符号会自动从包KEYWORD导出(keyword::barkeyword: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)

实际上,它们不是变量;那些是关键词。它们是一种特殊的有效标记,类似于其他语言中的“原子”。这是一种方便的内置方法,可以将命名(和几乎总是可选的)参数传递给函数调用。

http://www.gigamonkeys.com/book/functions.html描述了函数调用的语法。