Next: , Previous: , Up: GNU Emacs Internals   [Contents][Index]


E.8 オブジェクトの内部

Emacs Lispは豊富なデータタイプのセットを提供します。コンスセル、整数、文字列のようにこれらのいくつかは、ほとんどすべてのLisp方言で一般的です。マーカやバッファーのようなそれ以外のものはLisp内でエディターコマンドを記述するための基本的サポートを提供するために極めて特別かつ必要なものです。そのような種々のオブジェクトタイプを実装してインタープリターのサブシステムとの間でオブジェクトを渡す効果的な方法を提供するために、Cデータ構造体セットとそれらすべてにたいするポインターを表すタグ付きポインター(tagged pointer)と呼ばれる特別なタイプが存在します。

Cではタグ付きポインターはタイプLisp_Objectのオブジェクトです。そのようなタイプの初期化された変数は基本的なデータタイプである整数、シンボル、文字列、コンスセル、浮動小数点数、ベクター類似オブジェクトや、その他の雑多なオブジェクトのいずれかを値として常に保持します。これらのデータタイプのそれぞれは対応するタグ値をもちます。すべてのタグはenum Lisp_Typeにより列挙されており、Lisp_Objectの3ビットのビットフィールドに配置されます。残りのビットはそれ自身の値です。整数は即値(値ビットで直接表される)、他のすべてのオブジェクトはヒープに割り当てられた対応するオブジェクトへのCポインターで表されます。Lisp_Objectのサイズはプラットフォームと設定に依存します。これは通常は背景プラットフォームのポインターと同一(32ビットマシンなら32ビット、64ビットマシンなら64ビット)ですがLisp_Objectが64ビットでも、すべてのポインターが32ビットのような特別な構成もあります。後者はLisp_Objectにたいして64ビットのlong longタイプを使用することにより、32ビットシステム上のLisp整数にたいする値範囲の制限を乗り越えるためにデザインされたトリックです。

以下のCデータ構造体は整数ではない基本的なデータタイプを表すためにlisp.hで定義されています:

struct Lisp_Cons

コンスセル。リストを構築するために使用されるオブジェクト。

struct Lisp_String

文字列。文字シーケンスを表す基本的オブジェクト。

struct Lisp_Vector

配列。インデックスによりアクセスできる固定サイズのLispオブジェクトのセット。

struct Lisp_Symbol

シンボル。一般的に識別子として使用される一意な名前のエンティティ。

struct Lisp_Float

Floating-point value.

union Lisp_Misc

上記のいずれにも適合しない雑多な種類のオブジェクト。

これらのタイプは内部的タイプシステムのファーストクラスの市民です。タグスペースは限られているので他のすべてのタイプはLisp_VectorlikeLisp_Miscのサブクラスです。サブタイプのベクターはenum pvec_typeにより列挙されておりウィンドウ、バッファー、フレーム、プロセスのようなほとんどすべての複雑なオブジェクトはこのカテゴリーに分類されます。マーカーとオーバーレイを含む残りのスペシャルタイプはenum Lisp_Misc_Typeにより列挙されており、Lisp_Miscのサブタイプセットを形成します。

Lisp_Vectorlikeのいくつかのサブタイプを説明します。バッファーオブジェクトは表示と編集を行うテキストを表します。ウィンドウはバッファーを表示したり同一フレーム上で再帰的に他のウィンドウを配置するためのコンテナーに使用される表示構造の一部です(Emacs LispのウィンドウオブジェクトとXのようなユーザーインターフェースシステムに管理されるエンティティとしてのウィンドウを混同しないこと。Emacsの用語では後者はフレームと呼ばれる)。最後にプロセスオブジェクトはサブプロセスの管理に使用されます。