21

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))
      ))
4

2 に答える 2

36

キーワード記号

: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

使用法

キーワード シンボルは、たとえば、名前付き引数の名前として使用されます。

(defun foo (&key bar) (+ bar 10))

(foo :bar 7)

通常、これらはインスタンスおよび構造構築の引数にも使用されます。

(defstruct node state parent action)

DEFSTRUCTは Common Lisp マクロで、いくつかの関数を生成します。それらの 1 つは functionMAKE-NODEで、次のように使用できます。

(make-node :state 'open
           :parent some-parent
           :action an-action)

注: データがキーワードである場合もあります。たとえば、上記の形式では、状態は次のようになる場合:openとそうでない場合がありopenます。

(make-node :state :open
           :parent some-parent
           :action an-action)
于 2011-12-19T21:10:54.977 に答える
21

実際には変数ではありません。それらがキーワードです。これらは、他の言語の「アトム」に似た、特別な種類の効率的なトークンです。これは、関数呼び出しに名前付き (そして、ほとんどの場合、省略可能) パラメーターを渡すための便利な組み込みの方法です。

http://www.gigamonkeys.com/book/functions.htmlでは、関数呼び出しの構文について説明しています。

于 2011-12-19T20:46:29.350 に答える