Next: Definitions, Up: Symbols [Contents][Index]
各シンボルは4つの構成要素(もしくは“セル”)をもち、各構成要素はそれぞれ別のオブジェクトを参照します:
そのシンボルの名前。
そのシンボルの、変数としての現在の値。
そのシンボルの関数定義。これはシンボル、キーマップ、キーボードマクロも保持できる。
そのシンボルのプロパティーリスト。
プリント名のセルは常に文字列を保持し、それを変更することはできません。他の3つのセルには、任意のLispオブジェクトをセットすることができます。
プリントメイのセルは、シンボルの名前となる文字列を保持します。シンボルは、シンボル名によりテキストとして表されるので、2つのシンボルが同じな前をもたないことが重要です。Lispリーダーは、シンボルを読み取るごとに、新たにそれを作成する前に、指定されたシンボルがすでに存在するか調べます。シンボルの名前を得るには、関数symbol-name
(Creating Symbolsを参照してください)を使用します。
値のセルは、シンボルの変数としての値(そのシンボル自身がLisp式として評価されたときに得る値)を保持します。ローカルバインディング(local
binding)やスコーピングルール(scoping
rules)などのような複雑なものを含め、変数がセットされたり、取得される方法については、See Variablesを参照してください。ほとんどのシンボルは、値として任意のLispオブジェクトをもつことができますが、一部の特別なシンボルは変更できない値をもちます。これらには、nil
、t
、および名前が‘:’で始まる任意のシンボル(キーワード(keyword)と呼ばれます)が含まれます。Constant Variablesを参照してください。
関数のセルは、シンボルの関数定義を保持します。実際は、foo
の関数セルの中に保管されている関数を意味するとき、“関数foo
”といってそれを参照することがよくあります。わたしたちは、必要な土岐だけ、これを明確に区別することにします。関数セルは通常、関数(Functionsを参照してください)か、マクロ(Macrosを参照してください)を保持するために使用されます。しかし、関数セルはシンボル(Function Indirectionを参照してください)、キーボードマクロ(see Keyboard Macros)、キーマップ(see Keymaps)、またはオートロードオブジェクト(Autoloadingを参照してください)を保持するためにも使用できます。シンボルの関数セルの内容を得るには、関数symbol-function
(Function Cellsを参照してください)を使用します。
プロパティーリストのセルは通常、正しくフォーマットされたプロパティーリストを保持するべきです。シンボルのプロパティーリストを得るには、関数symbol-plist
を使用します。Symbol Propertiesを参照してください。
巻子失せると値セルが、void(空)のときもあります。voidとは、そのセルがどのオブジェクトも参照していないことを意味します(これは、シンボルvoid
を保持することとは異なり、シンボルnil
を保持することとも異なります)。voidの関数セルまたは値セルを調べようとすると、結果は‘Symbol's
value as variable is void’のようなエラーとなります。
それぞれのシンボルは値セルと関数セルを別個にもつので、変数名と関数名が衝突することはありません。たとえば、シンボルbuffer-file-name
が、値(カレントバッファーでvisitされているファイルの名前)をもち、同様に関数定義(ファイルの名前をreturnする基本関数)をもつことができます:
buffer-file-name ⇒ "/gnu/elisp/symbols.texi" (symbol-function 'buffer-file-name) ⇒ #<subr buffer-file-name>