2011-12-19 9 views
14

で変数の前になぜ?私はそのようなプログラムを見てきました。ここでは、大きなセットの関数の中からいくつかのサンプルコードを紹介します。コロン構文、Common Lispの変数の前にコロンは、何を意味している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)) 
    )) 

答えて

18

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

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

27

キーワードシンボル

:fookeywordシンボルです。

  • にインターンと常に1が、以下の特性の組み合わせを必要とするとき使用

    キーワードのシンボルが使用されている

自体にバインド

  • KEYWORDパッケージからエクスポート:

    • シンボルと同じ名前を持つ
    • シンボルは(パッケージでそれらをインターンで)一意である必要があります適切なデータ構造である - パッケージKEYWORD
    • 書き込み> - >パッケージKEYWORD
    • 異なるパッケージが必要または望んでいたされていませんシンボルは、それらを引用する必要がないことで、簡単にする必要があります - >:foo':foo
    • よりも優れて異なる値を持つ変数が必要とされていないとして作用する能力 - >:foo:foo自体にのみ:foo
    0123に評価Common Lispでは

    一般記号はパッケージ(名前空間のようなもの)にすることができます。

    fooの中の記号barfoo::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 :state 'open 
          :parent some-parent 
          :action an-action) 
    

    注:時々データもキーワードかもしれないそのうちの一つは、として使用することができます機能MAKE-NODE、です。 「**エクスポートされたシンボル** ... FOO 'のように記述されています:

    (make-node :state :open 
          :parent some-parent 
          :action an-action) 
    
  • +0

    あなたが書く:上記のフォームでは例えば、状態は:openなくopenかもしれません。bar' * 1つのコロンが使用されています* .. "と" [キーワード]シンボルは**自動的に**にエクスポートされます "しかし、あなたの例は'(eq 'keyword :: bar':bar) 'を表示します。キーワードを常にエクスポートすると、なぜダブルコロンを使用するのですか? '::'は、エクスポートされたシンボルとエクスポートされていないシンボルの両方で使用できますか? –

    +0

    @GlennSlaydenはい、エクスポートされた、またはエクスポートされていないすべてのインターナショナルシンボルは、package :: nameと書くことができます。エクスポートされたシンボルだけをpackage:nameとして書き込むことができます。キーワードシンボルは、名前としてのみ記述できます。 –

    +0

    完全性のために、 ':: bar'はどうですか?それでも 'KEYWORD'パッケージを参照しているのですか、それとも今はグローバルの他の形式ですか? LISP初心者のために申し訳ありません。 –