Emacs Lispは、豊富なデータ型を備えています。コンスセル、整数、文字列などの一部の型は、ほぼすべてのLisp方言に共通しています。一方、マーカーやバッファなどの一部の型は非常に特殊であり、Lispでエディタコマンドを記述するための基本的なサポートを提供するために必要となります。このような多様なオブジェクト型を実装し、インタプリタのサブシステム間でオブジェクトを効率的に受け渡しできるよう、一連のCデータ構造と、それらすべてへのポインタを表す特殊な型が用意されており、これはタグ付きポインタとして知られています。
C言語において、タグ付きポインタはLisp_Object型のオブジェクトである。この型の初期化済み変数は、常に整数、シンボル、文字列、コンスセル、浮動小数点数、またはベクトル型オブジェクトのいずれかの基本データ型の値を保持する。これらのデータ型にはそれぞれ対応するタグ値がある。すべてのタグはenum Lisp_Typeによって列挙され、Lisp_Objectの3ビットビットフィールドに格納される。残りのビットは値そのものである。整数はイミディエイト(immediate)、すなわちそれらの値ビットによって直接表現され、その他のすべてのオブジェクトは、ヒープから割り当てられた対応するオブジェクトへのCポインタによって表現される。Lisp_Objectの幅はプラットフォームおよび構成に依存する。通常は基盤となるプラットフォームポインタの幅(すなわち、32ビットマシンでは32ビット、64ビットマシンでは64ビット)と等しいが、Lisp_Objectが64ビットでありながらすべてのポインタが32ビットであるという特殊な構成も存在する。後者の手法は、Lisp_Objectに64ビットのlong
long型を用いることで、32ビットシステムにおけるLisp整数の値の範囲の制限を克服するために考案された。
整数以外の基本データ型を表すために、lisp.h で以下の C データ構造が定義されています。
struct Lisp_Consリストの構築に使用されるオブジェクト、Consセル。
struct Lisp_String文字列:文字の並びを表す基本オブジェクト。
struct Lisp_Vector配列:インデックスでアクセス可能な、固定サイズのLispオブジェクトの集合。
struct Lisp_Symbolシンボル:識別子として一般的に用いられる一意の名前を持つエンティティ。
struct Lisp_Float浮動小数点値。
これらの型は、内部型システムにおける第一級市民である。タグ空間が限られているため、他のすべての型はLisp_Vectorlikeのサブタイプとなる。ベクトルのサブタイプはenum
pvec_typeによって列挙されており、ウィンドウ、バッファ、フレーム、プロセスといったほぼすべての複雑なオブジェクトがこのカテゴリに属する。
以下に、Lisp_Vectorlike
のいくつかのサブタイプについて説明します。バッファオブジェクトは、表示および編集対象のテキストを表します。ウィンドウは、バッファを表示する表示構造の一部であるか、あるいは同一フレーム上に他のウィンドウを再帰的に配置するためのコンテナとして機能します。(Emacs
Lispのウィンドウオブジェクトと、Xなどのユーザーインターフェースシステムによって管理される実体としてのウィンドウを混同しないでください。Emacsの用語では、後者はフレームと呼ばれます。)最後に、プロセスオブジェクトはサブプロセスの管理に使用されます。