次: , 前: Symbols, 上: Symbols


7.1 シンボルの構成要素

各シンボルには4つの構成要素(つまり、『セル』)があり、 それぞれで別のオブジェクトを参照します。

表示名(print name)
表示名セル(print name cell)には、 シンボルの入力や表示に使う名前である文字列が入っている。 Creating Symbolssymbol-nameを参照。
値(value)
値セル(value cell)には、 シンボルの変数としての現在値が入っている。 シンボルをフォームとして使用したとき、 フォームの値はシンボルの値セルの内容である。 Accessing Variablessymbol-valueを参照。
関数(function)
関数セル(function cell)には、シンボルの関数定義が入っている。 シンボルを関数として使用したとき、その関数定義を使う。 シンボルが、編集コマンドを実行するためのキーマップやキーボードマクロを 表すときもこのセルを使う。 各シンボルには値セルと関数セルが別々にあるので、 変数名と関数名は衝突しない。 Function Cellssymbol-functionを参照。
属性リスト(property list)
属性リストセル(property list cell)には、 シンボルの属性リストが入っている。 Property Listssymbol-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-namesymbol-valuesymbol-plistsymbol-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で書いた関数を表すシンボルでは、 このセルにラムダ式(あるいはバイトコードオブジェクト)が入っています。