% System-Class SYMBOL
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. シンボルの印字