System Class SYMBOL
シンボルは、オブジェクトの同一性のために、 Common Lispでは、変数や関数といった(しかし限定はしない)言語的な実体を含む、 様々な実体に名前を付けるために使用されます。
シンボルはパッケージの中に集めることができます。 もしシンボルがパッケージからアクセス可能な時、 シンボルはパッケージにintern
されたと言います。 同じシンボルは、複数のパッケージにintern
することができます。 もしシンボルがどのパッケージにもintern
されていないとき、 それはunintern
と呼ばれます。
intern
されたシンボルは、 アクセス可能などのパッケージからもその名前によって 一意に識別することができます。
歴史的な理由からこれをcell
と呼ぶことがありますが、 実際のシンボルの内部表現とそれらの属性は実装依存です。
symbol-name
は、引数のシンボルの名前を返却します。 シンボルはその名前にどのような文字も保有します。 nil
のときは、 シンボルはホームパッケージを持たないと言われることがあります。 intern
されたとき、 その最初にintern
されたパッケージがホームパッケージになります。 シンボルのホームパッケージは、 関数symbol-package
を使うことでアクセスできます。 unintern
されたとき、 そのホームパッケージにはnil
が設定されます。 そのシンボルが他にintern
されているパッケージがあるかどうかによって、 シンボルが本当にunintern
されたシンボルかもしれませんし、 そうでないかもしれません。 したがって、ホームパッケージがないシンボルは、 見かけ上はunintern
されたと呼ばれます。 COMMON-LISP
パッケージか、KEYWORD
パッケージの 外部シンボルのホームパッケージを変更しようとしたときの 結果は未定義です。 getf
, remf
, symbol-plist
など)、 シンボルのプロパティリストを参照し暗黙に操作するもの (get
, remprop
など)の両方を提供しています。 新しいシンボルに関連付けられるプロパティリストは、 初期状態ではnull
です。 bound
されていると言われ、 そのことは関数boundp
によって検出できます。 bound
シンボルの値のセルに含まれるオブジェクトは そのシンボルによって名付けられたグローバル変数の値あり、 関数symbol-value
によってアクセスできます。 シンボルは、関数makunbound
によってunbound
にできます。 unbound
にしようとしたときの結果は未定義です。 fbound
されていると言われ、 そのことは関数fboundp
によって検出できます。 もしシンボルがグローバル環境下の関数の名前である場合は、 関数のセルにはその関数が含まれ、 関数symbol-function
によってアクセスできます。 もしシンボルがグローバル環境下のマクロ名か(macro-function
を参照)、 あるいは特殊オペレーター名(special-operator-p
を参照)であるときは シンボルはfbound
であり、関数symbol-function
でアクセス可能です。 しかしその関数のセルに含まれるオブジェクトは実装依存の型と意味なります。 シンボルは、関数fmakunbound
によってfunbound
にすることができます。 シンボルの値のセルや関数のセルに対する操作は、 シンボル自身に対する影響という観点から説明されることがありますが、 ユーザーは、これらのセルの内容とグローバル変数やグローバル関数定義との間に 密接な関係があることを心に留めておく必要があります。
シンボルはレキシカル変数やレキシカル関数の定義の識別子として使用されますが、 その役割においては、ただオブジェクトの同一性のみが重要です。 Common Lispはシンボルに対して、レキシカル変数やレキシカル関数の定義に 影響を与えるような操作は提供されません。
2.3.4. トークンとしてのシンボル, 2.3.1.1. トークンとしての潜在的数, 22.1.3.3. シンボルの印字