次: Definitions, 前: Symbols, 上: Symbols
各シンボルには4つの構成要素(つまり、『セル』)があり、 それぞれで別のオブジェクトを参照します。
symbol-name
を参照。
symbol-value
を参照。
symbol-function
を参照。
symbol-plist
を参照。
表示名セルはつねに文字列を保持していて、変更できません。 他の3つのセルには、任意の指定したLispオブジェクトを個別に設定できます。
表示名セルは、シンボルの名前である文字列を保持しています。 シンボルはテキスト上はその名前で表現されるので、 2つのシンボルが同じ名前を持たないことが重要です。 Lispリーダがこのことを保証します。 シンボルを読み取るたびに、新たにシンボルを作成するまえに、 指定した名前のシンボルが存在するかどうか調べます。 (GNU Emacs Lispでは、これにはハッシュアルゴリズムと オブジェクト配列obarrayを使う。 see Creating Symbols。)
普通の使い方では、関数セルには関数(see Functions)や
マクロ(see Macros)が入っていて、
Lispインタープリタはそのように仮定します(see Evaluation)。
シンボルの関数セルには、
キーボードマクロ(see Keyboard Macros)、キーマップ(see Keymaps)、
自動ロードオブジェクト(see Autoloading)が入っていることもあります。
『関数foo
』といった場合、実際には、シンボルfoo
の関数セルに
入っている関数を意味します。
必要な場合に限って区別します。
属性リストセルは、通常、正しい形式の属性リスト(see Property Lists)が 入っている必要があり、さまざまな関数がそのように仮定しています。
関数セルや値セルは空(void)でもかまいません。
つまり、セルはどんなオブジェクトも指していません。
(このことは、シンボルvoid
を保持しているとか、
シンボルnil
を保持しているのとは違う。)
空である関数セルや値セルを参照すると、
その結果は`Symbol's value as variable is void'
(「変数としてのシンボルの値は空」)のようなエラーになります。
4つの関数、symbol-name
、symbol-value
、
symbol-plist
、symbol-function
は、
シンボルの4つのセルの内容を返します。
以下に、シンボルbuffer-file-name
の
4つのセルの内容を表示する例を示します。
(symbol-name 'buffer-file-name) => "buffer-file-name" (symbol-value 'buffer-file-name) => "/gnu/elisp/symbols.texi" (symbol-plist 'buffer-file-name) => (variable-documentation 29529) (symbol-function 'buffer-file-name) => #<subr buffer-file-name>
このシンボルは、カレントバッファで訪問しているファイルの名前を保持するので、
値セルの内容は本書Emacs Lispマニュアルの本章のソースファイルの名前です。
属性リストセルには、リスト(variable-documentation 29529)
が入っていて、
ドキュメント関数に対してファイルDOC-versionのどこに
変数buffer-file-name
の説明文字列が入っているか伝えます。
(29529は、当該説明文字列の開始位置を表す
DOC-versionの先頭からのオフセット。
Documentation Basicsを参照。)
関数セルには、ファイルの名前を返す関数が入っています。
buffer-file-name
は基本関数の名前です。
これには入力構文はなく、
ハッシュ記法(see Primitive Function Type)で表示されています。
Lispで書いた関数を表すシンボルでは、
このセルにラムダ式(あるいはバイトコードオブジェクト)が入っています。