[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2. Lisp のデータ型

Lispオブジェクト(object)とはLispのプログラムによって使用 されたり、処理されたりするデータです。私たちの世界では、 型(type)またはデータ型(data type)は、あらゆるオブジェクト の集合を表します。

すべてのオブジェクトは少なくとも一つの型に属します。同じ型の オブジェクトは類似した構造をもち、通常は同じ文脈で使用できます。型は オーバラップでき、オブジェクトは二つ以上の型に属することができます。 そのため、オブジェクトが特定の型に属しているかを尋ねることはできますが、 オブジェクトの型が「何」であるかは尋ねられません。

いくつかの根本的なオブジェクト型はEmacs内に組み込まれています。 これら残りすべての型を構成する元になるものは プリミティブ型(primitive type)と呼ばれます。 個々のオブジェクトは、ただ一つのプリミティブ型に属しています。 これらの型には整数(integer)浮動小数点数(float)コンス(cons)シンボル(symbol)文字列(string)ベクタ(vector)subrバイトコード関数(byte-code function)、 さらに、バッファ(buffer)のように編集と関係のある、 いくつかの特殊な型(see section 編集型)が含まれます。

個々のプリミティブ型はそれぞれに、あるオブジェクトがその型の メンバーであるかどうかをチェックするためのLisp関数を持っています。

Lispのオブジェクトはそれ自身が型を持っている(self-typing)という 点において、他の多くの言語とは違っていることに注意してください。 オブジェクトのプリミティブ型は、そのオブジェクト自身に暗黙に埋め込まれて います。例えば、オブジェクトがベクタであるならば、どうやってもそれを 数値として扱うことはできません。Lispは、それがベクタであり、数ではない ことを知っています。

ほとんどの言語において、プログラマは個々の変数のデータ型を宣言しなければ ならず、型はコンパイラが知っているだけでデータの中には表されていません。 そうした型の宣言というものはEmacs Lispには存在しません。Lisp変数は、 どのような型の値でももつことができ、どんな値を格納したとしても、 型やすべてを憶えています。

この章ではGNU Emacs Lispの個々の標準型の目的、印字表現、 リード構文について述べます。これらの型の使用方法の詳細は 後々の章で述べられています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 印字表現とリード構文

オブジェクトの印字表現(printed representation)とは、 そのオブジェクトに対してLispプリンタ(関数 prin1)が生成する 出力形式です。オブジェクトのリード構文(read syntax)とは、 そのオブジェクトとしてLispリーダ(関数 read)が認識する 入力形式です。ほとんどのオブジェクトは、一つ以上のリード構文をもっています。 中にはリード構文をもってない型のオブジェクトもありますが、そのような場合 を除いて、オブジェクトの印字表現は、そのオブジェクトのリード構文でも あります。

他の言語では、式はテキストです。それ以外の形式はまったくありません。 Lispでは、式はオブジェクトであることが根本であり、オブジェクトの リード構文であるテキストは従属的なものでしかありません。 この区別を強調する必要はほとんどありませんが、 このことは心の奥にとどめておくことが必要で、そうしなければ、非常に混乱 することがあるでしょう。

すべての型は印字表現をもっています。いくつかの型はリード構文を 持っていません。そうなっているのはLispプログラム中にその型の オブジェクトを直接に書くことに意味がないからです。例えば、バッファ型 はリード構文をもっていません。そのような型のオブジェクトは ハッシュ表記(hash notation)で印字されます。ハッシュ表記は 文字`#<'の後に説明の文字列(通常、型名のあとにオブジェクトの 名前を続けたもの)が続き、対応する`>'で終わります。ハッシュ表記を 読み込むことはまったくできません。 したがってLispリーダは`#<'に出くわすと エラーinvalid-read-syntaxを発します。

 
(current-buffer)
     ⇒ #<buffer objects.texi>

あなたが式を対話的に評価するときには、Lispインタプリタは最初、 そのテキスト表現を読み、Lispオブジェクトを作成し、それから、 評価を行ないます(see section 評価)。しかし、評価と読込みは 別々な動作です。読込みは、読み込まれたテキストが表現しているLisp オブジェクトを返します。そのオブジェクトは後で評価されることも、 されないこともあります。オブジェクトの読み込みを行う 基本関数readの説明はSee section 入力関数


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 コメント

コメント(comment)は、プログラムの読み手のためにだけ、それに書き込まれる テキストであり、プログラムの意味にはまったく影響を与えません。 Lispにおいて、セミコロン(`;')が文字列定数、または文字定数内にな いならば、それがコメントの始まりになります。コメントは行末まで続きます。 Lispリーダはコメントを捨てます。したがって、コメントはLispシステムに おいてプログラムを表しているLispオブジェクトの一部とはなりません。

次のcount文字を読み飛ばす`#@count'構文要素 はバイナリ・データを含んだ、プログラムによって生成されたコメント に有用です。Emacs Lispのバイトコンパイラは、これをその出力ファイルに 使用します(see section バイトコンパイル)。しかし、それはソース・ファイルに 使うものではありません。

コメントの形式の規則については、See section コメントの書き方


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 プログラム型

Emacs Lispの型には二つの一般的なカテゴリがあります。一方はLispの プログラミングで必要となるもので、もう一方は編集で必要となるものです。 前者は同じ形式、または別の形式で、多くのLispの処理系に存在します。 後者はEmacs Lisp特有のものです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.1 整数型

Emacs Lispの整数の値の範囲は、たいていのマシンでは-134217728 から134217727まで(28 ビット、すなわち から です。(マシンによってはより広い範囲を扱えます。) Emacs Lispの算術演算用の関数は桁あふれをチェックしないので注意が 必要です。つまり、たいていのマシンでは (1+ 134217727)が-134217728になってしまいます。

整数のリード構文は(基数10の)数字の列であり、先頭に符号があってもよく、 終端にピリオドがあってもよいです。Lispインタプリタによって作成 される印字表現では`+'で始まったり、`.'で終わったりする ことはまったくありません。

 
-1               ; 整数 -1
1                ; 整数 1
1.               ; これも整数 1
+1               ; これも整数 1
268435457        ; これも整数 1!
                 ;   (28 ビット実装の場合)

詳細はSee section 数値


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.2 浮動小数点型

Emacsバージョン19では浮動小数点数をサポートします(無効にする コンパイル・オプションもあります)。浮動小数点数の正確な範囲は マシン依存です。

浮動小数点数の印字表現は小数点(最低一つの数字が後に続く)、 指数、または両方を必要とします。例えば、`1500.0', `15e2', `15.0e2', `1.5e3', `.15e4' は、値が1500である浮動 小数点数を書く五つの方法です。それらはすべて等価です。

詳細は See section 数値


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3 文字型

Emacs Lispの文字(character)は整数以外のなにものでもありません。 すなわち、文字はそれらのキャラクタコードで表されています。 例えば、文字Aは整数65として表されます。

個々の文字がそれ単体でプログラムに使用されるのは、まれなことです。 文字列(文字から構成されているシーケンス)で扱うことのほうが、 より一般的です。See section 文字列型

文字列、バッファ、およびファイル内の文字は現在のところ0から255まで の範囲の間(8ビット)に制限されています。あなたが、文字列、バッファ、 またはファイルに、それより大きな整数を格納しても、その範囲に切り捨てられます。 キーボード入力を表している文字は、ずっと広い範囲をもっています。

文字はまさに整数であるので、文字の印字表現は十進数です。これはまた、 文字として読み込み可能なリード構文でもありますが、Lispプログラムにおい て、そのような方法で文字を書くのは非常に悪い考えです。あなたはEmacs Lispが文字のために提供する、特別なリード構文の形式を常に使用する べきです。この構文の形式は疑問符で始まります。

英数字として通常使われるリード構文は疑問符の後に文字が続いたものです。 したがって、文字Aを表すのは`?A'、文字Bを表す のは`?B'、文字aを表すのは`?a'です。

例えば:

 
?Q ⇒ 81     ?q ⇒ 113

句読点文字に対しても同一の構文が使用できますが、多くの場合`\'をつけ加 えておくのがよい考えです。これはLispコードを編集するためのEmacs コマンドが誤動作しないようにするためです。例えば、`?\ 'はスペース 文字を書く方法です。文字が`\'であるならば、それを引用するために 二つ目の`\'を使用し`?\\'とする必要があります。

Control-g、バックスペース、タブ、改行、垂直タブ、改ページ、復帰、 エスケープの文字は、それぞれ `?\a', `?\b', `?\t', `?\n', `?\v', `?\f', `?\r', `?\e'で表すことがで きます。それらの値は十進数で 7, 8, 9, 10, 11, 12, 13, 27 です。 したがって、

 
?\a ⇒ 7                 ; C-g
?\b ⇒ 8                 ; バックスペース, BS, C-h
?\t ⇒ 9                 ; タブ, TAB, C-i
?\n ⇒ 10                ; 改行, LFD, C-j
?\v ⇒ 11                ; 垂直タブ, C-k
?\f ⇒ 12                ; 改ページ文字, C-l
?\r ⇒ 13                ; キャリッジ・リターン, RET, C-m
?\e ⇒ 27                ; エスケープ文字, ESC, C-[
?\\ ⇒ 92                ; バックスラッシュ文字, \

このような、バックスラッシュで始まるシーケンスはバックスラッシュが エスケープ文字の役割を果たすので、エスケープ・シーケンス(escape sequence) としても知られています。この用法は文字ESCと何の関係もありません。

制御文字は、さらに別のリード構文を使用して表されることがあります。これは 疑問符の後にバックスラッシュ、キャレット、対応する非制御文字(英大文字 または英小文字)が続いたものから成っています。例えば、`?\^I'`?\^i' はどちらも文字C-i(値が9である文字)を表す適正なリード構文です。

`^'の代わりに`C-'を使用することができます。したがって、 `?\C-i'`?\^I'`?\^i'と等価です。

 
?\^I ⇒ 9     ?\C-I ⇒ 9

文字列やバッファの中では、ASCIIに存在する制御文字だけに使用が制限されま すが、キーボード入力という目的では、あらゆる文字を`C-'によって 制御文字に変えることができます。 ASCIIでない制御文字の文字コードは対応する制御文字でないコードと ともに、 ビットを含んでいます。 通常の端末ではASCIIでない制御文字を生成する方法をもちませんが、 X端末では通常の使い方でそれらを生成することができます。

歴史上の理由により、EmacsはDEL文字をControl-?と同等に 扱います。

 
?\^? ⇒ 127     ?\C-? ⇒ 127

結果として、Xにおいては意味のある入力文字Control-?を表現するのは 現在のところ不可能です。 この方法でDELを参照しているLispファイル が多いので、これを変更するのは容易ではありません。

ファイルや文字列内の制御文字の表現には`^'構文を勧めます。 キーボード入力の制御文字には、私たちは`C-'構文を好みます。 この使い分けはプログラムの意味には何も貢献しませんが、それを読んだ人の 理解の助けになります。

メタ文字(meta character)とはMETA修飾キーとともにタイプ された文字です。そのような文字を表している整数は ビットがセットされています(ほとんどのマシンでは負の数で表されます)。 私たちは基本文字コードの幅を広くとるために、このメタ修飾子や他の修飾子など に上位のビットを使用しています。

文字列では ビットがメタ文字であることを示していています。したがって、 文字列内に存在できるメタ文字は128から255までの範囲のコードを もち、それは通常のASCII文字のメタバージョンです。 (Emacs 18 以前では、この規則が文字列以外に含まれる文字にも適用 されていました。)

メタ文字のリード構文は`\M-'を使用します。例えば、 `?\M-A'M-Aを意味します。あなたは8進文字コード(後を参照)、 `\C-'、または他のあらゆる文字の構文に対して、`\M-'を使用できます。 したがって、M-A`?\M-A'とも`?\M-\101'とも記述する ことができます。同様に、C-M-b`?\M-\C-b'とも`?\C-\M-b' とも`?\M-\002'とも記述することができます。

通常の英文字の大文字、小文字の区別は、その文字のASCII部分のコード よって示されますが、ASCIIは制御文字が大文字であるか小文字であるか を表現する手段を持っていません。Emacsは制御文字をタイプする際に シフトキーが使用されたことを示すのに、 ビットを使用します。この区別はX端末、または他の特殊な端末を使用する ときにだけ可能です。通常の端末にはコンピュータにその区別を示す術が ありません。

Xウィンドウ・システムは、文字に設定することのできる修飾子ビット としてさらに三つ定義しています。即ちハイパー(hyper)スーパー(super)オルト(alt)です。 これらのビットの構文は、それぞれ`\H-', `\s-', `\A-'です。したがって`?\H-\M-\A-x'Alt-Hyper-Meta-xを表します。

結局のところ、最も一般的なリード構文は、疑問符の後に、バックスラッシュと 8進数の文字コード(3個まで)が続いたものから成っています。 したがって、文字A`?\101'、文字C-a`?\001'、 文字C-b?\002と表します。 この構文は、あらゆるASCII文字を表すことができますが、 明示的な8進数の値がASCII表現より重要なときだけに、使用するのが よいでしょう。

 
?\012 ⇒ 10         ?\n ⇒ 10         ?\C-j ⇒ 10
?\101 ⇒ 65         ?A ⇒ 65

特別なエスケープの意味をもたない、あらゆる文字に対しても、その前にバック スラッシュをつけることは許されていますが、その効果はありません。 したがって、`?\+'`?+'と等価です。 ほとんどの文字に対しては、その前にバックスラッシュをつける必要性はまった くありません。しかし、Lispコードの編集では、Emacs のコマンドが 混同するのを避けるために、文字 `()\|;'`"#.,'の前にはバックスラッシュ をつけておくべきです。また、スペース、タブ、改行、改ページのよう な空白文字の前にもバックスラッシュをつけてください。しかし、タブのような ものは実際の空白文字よりも`\t'のように読みやすい エスケープ・シーケンスを使用したほうがよりすっきりします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.4 シンボル型

GNU Emacs Lispでのシンボル(symbol)は名前をもつオブジェクトです。 シンボルの名前はシンボルの印字表現でもあります。通常の使用においては、 名前は一意であり、二つのシンボルが同じ名前をもつことはありません。

シンボルは変数としても関数名としても使用できますし、属性リストを 保持するものとしても使用することができます。 また、単にデータ構造中でその存在を確実に認識するために、他のどんな Lispオブジェクトとも区別されるように使用することもあります。 与えられた文脈においては、普通これらの使用目的のうちの一つだけが 意図されています。しかし、一つのシンボルに対して、これらの方法の うちのすべてを、別個に使用することは可能です。

シンボル名は、あらゆる文字を含むことができます。ほとんどのシンボル名は 英文字、数字、および句読点文字`-+=*/'で記述されます。 そのような名前は特殊な句読点文字を必要としません。 名前に使用する文字は、その名前が数値と似ないようになっていれば十分です (それを行うのであれば、強制的にシンボルとして解釈されるように、名前の 先頭に`\'を記述してください)。 文字`_~!@$%^&:<>{}'は、あまり使用されることはありませんが、 使用するとしても特殊な句読点文字を必要としません。 他のあらゆる文字はバックスラッシュでエスケープすることによって、 シンボルの名前の中に含めることができます。 文字列での使用とは異なり、シンボルの名前でのバックスラッシュは 単にバックスラッシュに続く一つの文字を示すだけです。 例えば、文字列において`\t'はタブ文字を表しています。 しかし、シンボルの名前において`\t'は単に文字tを示します。 シンボルの名前の中にタブ文字を含めるためには実際のタブ文字(前置する バックスラッシュが必要)を使用しなければなりません。 しかし、そのようなことをするのはまれです。

Common Lisp注意書き: Common Lisp では明示的に回避されないかぎり、 英小文字は常に英大文字に「変換して解釈」されます。Emacs Lispでは、 英大文字と英小文字は区別されます。

以下に、シンボル名の例をいくつか示します。 5番目の例での`+'は数値として読み込まれないようにするために、 エスケープされていることに注意してください。 6番目の例にも`+'がありますが、名前の他の部分から数値としては 無効であるとわかるのでエスケープする必要はありません

 
foo                 ; `foo'という名前のシンボル。
FOO                 ; `FOO'という名前のシンボル。
                    ;   `foo'とは異なる。
char-to-string      ; `char-to-string'という名前のシンボル。
1+                  ; `1+'という名前のシンボル
                    ;   (整数の`+1'ではありません)。
\+1                 ; `+1'という名前
                    ;   (あまり読みやすい名前ではありません)。
\(*\ 1\ 2\)         ; `(* 1 2)'という名前のシンボル(悪い名前)。
+-*/_~!@$%^&=:<>{}  ; `+-*/_~!@$%^&=:<>{}'という名前のシンボル。
                    ;   これらの文字はエスケープする必要はありません。

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.5 シーケンス型

シーケンス(sequence)とは要素の集合のうち順序のあるものを表す Lisp オブジェクトです。Emacs Lispでのシーケンスにはリストと配列の 2種類があります。したがって、リスト型や配列型のオブジェクトも シーケンスと考えられます。

配列はさらに文字列とベクタに分類されます。ベクタはどのような型の 要素でも保持できますが、文字列の要素は0から255までの範囲の文字で なければなりません。しかし、文字列内の文字はバッファ中の文字のように テキスト属性をもつことができます(see section テキスト属性)。ベクタは、 その要素が文字である場合でさえもテキスト属性をサポートしていません。

リスト、文字列、ベクタは違ったものですが、それらは重要な類似点をもっ ています。例えば、すべてのシーケンスは長さlを持ち、 0からl-1で順序づけされた要素をもっています。 また、シーケンス関数と呼ばれるいくつかの関数は、あらゆる種類の シーケンスを受け取ることができます。例えば、関数eltは 与えたインデックスに該当するシーケンスの要素を取り出すのに使用されます。 See section シーケンス、配列、ベクタ

シーケンスは読み込まれる度に新たに作成されるので、同じシーケンスを 二度読み込むのは不可能です。シーケンスのリード構文を二度読み込むと、 等しい内容の二つのシーケンスを得ます。 一つの例外があります。空リスト()は常に同じ オブジェクト nil を意味します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6 コンス・セル型とリスト型

コンス・セル(cons cell)CARCDRという名前の二つの ポインタから成るオブジェクトです。コンス・セルの二つのポインタは 任意のLispオブジェクトを指すことができます。

リスト(list)はコンス・セルが連続したもので、個々のコンス・セルの CDRが別のコンス・セルあるいは空リストを指すようにリンクされて います。リストに対する操作を行う関数については、See section リスト。 ほとんどのコンス・セルがリストの一部分として使用されているので、 リスト構造(list structure)という用語はコンス・セルで作られた任意の 構造であることを指しています。

CARCDRという名前は今では歴史上の意味だけをもっています。 オリジナルのLisp処理系はIBM 704コンピュータの上で動作し、そのコンピュータ では、ワードが"address"部と"decrement"部の二つの部分に分けられ ていました。CARはレジスタのaddress部の内容を取り出す命令で、 CDRはdecrement部の内容を取り出す命令でした。対照的に「コンス・セル」 という名前はコンス・セルを作成する関数 cons からきたもので、 その関数の目的であるセルの構築(construction of cells)というところ から名づけられています。

コンス・セルはLispでは非常に中心的なものであるので、「コンス・セルではな いオブジェクト」のための用語も用意されています。そのようなオブジェクトは アトム(atom)と呼ばれます。

リストのリード構文と印字表現は同一であり、左括弧、任意の個数の要素、 右括弧から成っています。

読み込むとすぐに、括弧で囲まれた中の個々のオブジェクトはリストの要素にな ります。いいかえると、個々の要素ごとにコンス・セルが作成されます。 コンス・セルのCARは要素を指し、CDRは、次のコンス・セルが リストの次の要素を保持しているなら、そのコンス・セルを指しています。 最後のコンス・セルのCDRNILを指すように設定されています。

リストはコンス・セルを一対の箱で表したダイアグラムによって図解できます。 (Lispリーダはそのような図を読むことはできません。 人間とコンピュータの両方が理解することのできるテキスト上の表記とは違い、 箱の図は人間だけに理解できます。) 以下は三つの要素のリスト (rose violet buttercup) を表しています。

 
    ___ ___      ___ ___      ___ ___
   |___|___|--> |___|___|--> |___|___|--> nil
     |            |            |
     |            |            |
      --> rose     --> violet   --> buttercup

このダイアグラムにおいて、個々の箱は、どのような Lisp オブジェクトでも 参照できるスロットを表しています。個々の箱の対はコンス・セルを表して います。個々の矢はLispオブジェクト、アトム、または別のコンス・セルへの リファレンスです。

この例において、最初のコンス・セルのCARである最初の箱は (シンボル)roseを参照、または「含んで」います。 最初のコンス・セルのCDRである2番目の箱は2番目のコンス・セルである 次の箱の対を参照しています。2番目のコンス・セルのCARvioletを参照し、CDRは3番目のコンス・セルを参照します。 3番目(最後)のコンス・セルのCDRnilを指しています。

以下に、同じリスト (rose violet buttercup) を違った方法で描いた 別のダイアグラムを示します。

 
 ---------------       ----------------       -------------------
| car   | cdr   |     | car    | cdr   |     | car       | cdr   |
| rose  |   o-------->| violet |   o-------->| buttercup |  nil  |
|       |       |     |        |       |     |           |       |
 ---------------       ----------------       -------------------

要素を持たないリストは空リスト(empty list)です。 それはシンボルnilと同一のものです。 いいかえると、nilはシンボルでもあり、リストでもあります。

以下にLispの構文で記述されたリストの例を示します。

 
(A 2 "A")            ; 三つの要素をもつリスト。
()                   ; 要素のないリスト(空リスト)。
nil                  ; 要素のないリスト(空リスト)。
("A ()")             ; 一つの要素(文字列"A ()")をもつリスト。
(A ())               ; 二つの要素(Aと空リスト)をもつリスト。
(A nil)              ; 直前のものと同じ。
((A B C))            ; 一つの要素(三つの要素をもつリスト)をもつリスト。

以下にリスト(A ())(または(A nil))を箱と矢で描いたも のを示します。

 
    ___ ___      ___ ___
   |___|___|--> |___|___|--> nil
     |            |
     |            |
      --> A        --> nil

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.1 ドット対表記

ドット対表記は、最後のCDRnilでないコンス・セルの 連鎖を表すために、リスト表記と組み合わせて使うことができます。 例えば、(rose violet . buttercup)は、 オブジェクトaCDRがオブジェクトbであるコンス・セル を意味しています。したがって、ドット対表記はリストの構文よりも 一般的です。リスト`(1 2 3)'はドット対表記では `(1 . (2 . (3 . nil)))'と記述されます。 nilで終わるリストに関しては、どちらの表記も同じ結果になりますが、 使用できる場合には、リスト表記がのほうが普通は、よりすっきりしていて、 より便利です。リストを印字するときには、セルのCDRがリスト でない場合のみドット対表記が使用されます。

以下にドット対を箱を使った表記で図解します。 この例は(rose . violet)の対を示しています。

 
    ___ ___
   |___|___|--> violet
     |
     |
      --> rose

ドット対表記はリスト表記とあわせて使用することもでき、そのような表記は 最後のCDRnilでないコンス・セルの連鎖を表します。 例えば、(rose violet . buttercup)(rose . (violet . buttercup))と同一のものです。 そのオブジェクトは以下のようになります。

 
    ___ ___      ___ ___
   |___|___|--> |___|___|--> buttercup
     |            |
     |            |
      --> rose     --> violet

これらのダイアグラムは、なぜ(rose . violet . buttercup) が不正な構文であるかを明らかにしています。 それは二つではなく、三つの部分をもつコンス・セルを必要としてしまうのです。

リスト(rose violet) は、(rose . (violet))と同一のものであ り、以下のようになります。

 
    ___ ___      ___ ___
   |___|___|--> |___|___|--> nil
     |            |
     |            |
      --> rose     --> violet

同様に、三つの要素をもつリスト(rose violet buttercup) は、(rose . (violet . (buttercup)))と同一のものです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.2 連想リスト型

連想リスト(association list)またはalistは、要素がコンス・セル の特別に構成されたリストです。個々の要素において、CARキー(key)と考えられ、CDR連想値(associated value)と 考えられます。(場合によっては、連想値はCDRCAR に格納されます。) 連想リストはリストの前に容易に連想を追加したり、 リストの前から連想を取り除いたりできるので、よくスタックとして使用されます。

例えば、

 
(setq alist-of-colors
      '((rose . red) (lily . white)  (buttercup . yellow)))

は、三つの要素をもつalistを変数alist-of-colorsに設定します。 最初の要素では、roseがキーであり、redが値です。

alistの詳細と、alistに対する関数についてはSee section 連想リスト


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.7 配列型

配列(array)は、他のLispオブジェクトを参照する任意個のスロットから 構成され、メモリの連続したブロックに配置されます。配列のどの要素に対する アクセスも、かかる時間は同じです。逆に、リストの要素のアクセスでは リストの要素の位置に比例した時間が必要となります。(リストの終端の要素は リストの先頭にある要素よりもアクセスに長い時間がかかります。)

Emacsは二つの配列型(文字列とベクタ)を定義します。文字列は文字の配 列であり、ベクタは任意のオブジェクトの配列です。両方の配列とも一次元で す(ほとんどの他のプログラミング言語では多次元配列をサポートしています が、それは本質的なものではありません。配列の配列によって、同じ効果を得るこ とができます)。いずれの配列型も、それ自身のリード構文をもっています。 文字列型およびSee section ベクタ型

配列は整数の最大値まで、どんな長さでももつことができます。しかし 一度作成されると、その大きさは固定です。配列の先頭の要素の添字は0で あり、2番目の要素は添字1を持ち、以下同様に添字が割り当てられます。 これは0起源(zero-origin)添字付けと呼ばれます。例えば、 四つの要素のある配列は添字 0, 1, 2, 3 を持ちます。

配列型はシーケンス型に含まれていて、文字列型とベクタ型を含んでいます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8 文字列型

文字列(string)は文字の配列です。文字列はテキスト・エディタ において予想されるように、Emacsにおいて多くの目的に使用されます。 例えば、Lisp のシンボルの名前として使用されたり、ユーザに対する メッセージとして使用されたり、バッファから取り出したテキストを表す ために使用されたりします。Lispでの文字列は定数です。文字列を評価すると 同じ文字列を返します。

文字列のリード構文は"like this"のように、二重引用符、任意の 数の文字、そして、もう一つの二重引用符から成っています。Lispリーダは 文字列の文字の読み込みのために、単一の文字の読み込みに使用するものと 同じ形式を受けつけます(文字定数の始まりを示す疑問符はいりません)。 タブ文字やC-aM-C-Aのような表示できない文字は便利な エスケープ・シーケンスを使用して"\t, \C-a, \M-\C-a"のように 入力できます。文字列内に二重引用符を含めるには、その前にバックスラッシュ をつけます。したがって、"\""は単一の二重引用符だけを含む文字列 です。(文字のリード構文の詳細はSee section 文字型。)

文字列定数内で、メタ文字であることを示すのに `\M-' を使用した場合、 文字列内のその文字の ビットがセットされます。 これは(文字列内ではない)文字それ自身のメタ修飾子と同じ表現ではありません。 See section 文字型

文字列は、ハイパー、スーパー、オルト修飾子をもった文字を保持できません。 文字列は、ASCII制御文字を保持できますが、それ以外の制御文字は 保持できません。ASCII制御文字では、大文字、小文字の区別はされません。

文字列の印字表現は二重引用符、文字列がもっている文字の並び、 そしてもう一つの二重引用符から成っています。 しかし、文字列内にあるバックスラッシュまたは二重引用符は "this \" is an embedded quote" のようにバックスラッシュで エスケープしなければなりません。

改行文字は、文字列のリード構文においては、特殊なものではありません。 二重引用符の間に改行を入れた場合、それは文字列内の文字になります。 しかし、前に`\'をつけてエスケープされた改行は文字列の一部分には なりません。すなわち、Lispリーダは文字列の読み込みで、エスケープされた 改行を無視します。

 
"It is useful to include newlines
in documentation strings,
but the newline is \
ignored if escaped."
     ⇒ "It is useful to include newlines 
in documentation strings, 
but the newline is ignored if escaped."

文字列は文字自身だけでなく、文字列が含んでいるテキストの属性を 保持できます。これによって、特殊な処理なしに、属性を維持した状態で 文字列とバッファの間でテキストをコピーするプログラムが可能になります。 See section テキスト属性。 テキスト属性をもつ文字列は特殊なリード構文と印字表現を持っています。

 
#("characters" property-data...)

ここで、property-dataは0個以上の要素から成っていて、 以下の三つのグループです。

 
beg end plist

要素begendは整数で、その二つで文字列内の添字の範囲を を指定します。plist は、その範囲に適用される属性リストです。

文字列に対する関数については、See section 文字列と文字


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.9 ベクタ型

ベクタ(vector)は、任意の型の要素の一次元配列です。 ベクタのどの要素に対するアクセスも、かかる時間は一定です。 (リストでは、要素のアクセス時間は要素のリストの最初からの距離と比例 しています。)

ベクタの印字表現は、左角括弧、要素の並び、そして右角括弧 から成っています。これはリード構文でもあります。 数値や文字列のように、ベクタは評価に関しては定数と考えられます。

 
[1 "two" (three)]      ; 三つの要素をもつベクタ。
     ⇒ [1 "two" (three)]

ベクタに関する関数については、See section ベクタ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.10 関数型

他のプログラミング言語の関数が実行可能なように、 Lisp関数(Lisp function)オブジェクトは、実行コードの一部です。 しかし、Lispの関数は、Lispオブジェクトであることが根本であり、 それを表現するテキストは従属的なものでしかありません。 ラムダ式、先頭要素がシンボルlambdaであるリスト、 はLispオブジェクトです。 (see section ラムダ式)。

ほとんどのプログラミング言語では、名前のない関数をもつことは不可能です。 Lispでは、関数は固有の名前をもちません。 ラムダ式は匿名関数(anonymous function)とも呼ばれます (see section 匿名関数)。 Lispにおける名前つきの関数は実際にはシンボルであり、その関数セルに 有効な関数をもちます(see section 関数の定義方法)。

ほとんどの場合、関数は、その名前がLispプログラム中のLisp式に記述され たときに呼ばれます。しかし、実行時に関数オブジェクトを構成したり、 取得したりすることができ、プリミティブ関数funcallapplyで それを呼び出すことができます。See section 関数の呼出し


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.11 マクロ型

Lispマクロ(Lisp macro)は、Lisp言語を拡張するユーザ定義の構文要素です。 それは、ほとんど関数のようなオブジェクトとして表現されますが、 パラメータ引き渡しの意味が異なっています。 Lispマクロは、先頭要素がシンボルmacroで、CDRlambdaシンボルを含むLisp関数オブジェクトであるリストの 形式を持っています。

Lispマクロは、普通、組込み関数defmacroで定義されますが、 macroで始まっていれば、どのようなリストもEmacsに関するかぎりは マクロです。マクロを記述する方法の説明はSee section マクロ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.12 プリミティブ関数型

プリミティブ関数(primitive function)は、プログラミング言語Cで 記述されていますがLispから呼び出すことのできる関数です。 プリミティブ関数はsubrとも、組込み関数(built-in function) とも呼ばれます。("subr"という用語は"subroutine"からきています。) ほとんどのプリミティブ関数は、それが呼ばれたときに、その引数のすべてを 評価します。すべてのその引数を評価するわけではないプリミティブ関数は、 特殊形式(special form)と呼ばれます(see section 特殊形式)。

関数がプリミティブであるかどうかは、関数を呼び出す側には重要ではありません。 しかし、Lispによって記述された関数で、同じ名前のプリミティブ関数を置き換えよう とするならば、これは重要になります。その理由は、プリミティブ関数はCコードか ら直接呼ばれうることです。再定義された関数をLispから呼び出す場合には、 その新しい定義が使用されますが、Cコードからの呼び出しは依然として 組込みの定義が使用されるかもしれません。

関数(function)という用語はLispで記述されたか、Cで記述されたか にかかわらず、すべてのEmacs関数を指します。Lispで記述された関数に ついては、See section 関数型

プリミティブ関数にはリード構文がなく、サブルーチンの名前をもつ ハッシュ表記で印字します。

 
(symbol-function 'car)          ; シンボルの関数セルのアクセス。
     ⇒ #<subr car>
(subrp (symbol-function 'car))  ; これはプリミティブ関数か?
     ⇒ t                       ; イエス。

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.13 バイトコード関数型

バイトコンパイラはバイトコード関数オブジェクト(byte-code function object) を作成します。 内部的には、バイトコード関数オブジェクトは、ほとんどベクタのようなもの です。しかし、それが関数として呼ばれるようなときには、評価子はこのデータ 型を特別に扱います。バイトコンパイラに関する情報は See section バイトコンパイル

バイトコード関数オブジェクトの印字表現とリード構文はベクタに似ていて、 始まりの`['の前に`#'がついています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.14 自動ロード型

自動ロード・オブジェクト(autoload object)は先頭要素がシンボル autoloadであるリストです。それは実際の定義の場所をもつ シンボルの関数定義として記憶されます。それは実際の定義が、必要なときに ロードされるLispコードのファイルの中にあることを示しています。 自動ロード・オブジェクトはファイルの名前と、 それに加えていくらかの実際の定義に関する情報を含んでいます。

ファイルがロードされると、そのシンボルは、自動ロード・オブジェクトではない 新しい関数定義をもつでしょう。その後、最初からそれがあったかのように 新しい定義が呼び出されます。ユーザーからみれば、ロードされたファイルに 含まれる関数定義を使用した関数呼出しが期待したとおりに動作するわけです。

自動ロード・オブジェクトは普通、関数 autoload によって作成 され、シンボルの関数セル内に記憶されます。 詳細は See section 自動ロード


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 編集型

前のセクションの型は多くのLispの方言で共通しています。 Emacs Lispは編集に関連した目的のために、いくつかの追加のデータ型を 提供します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.1 バッファ型

バッファ(buffer)は、編集可能なテキストを保持するオブジェクトです (see section バッファ)。ほとんどのバッファは、ディスク上のファイルの内容を 編集できるように保持していていますが、他の目的で使用されるも のもあります。ほとんどのバッファには、ユーザによって見られるという意義も あり、したがって、かなり長い間ウィンドウ上に表示されていることもあります (see section ウィンドウ)。しかし、バッファがどれかのウィンドウに表示されて いる必要はありません。

バッファの中身は、ほとんど文字列のようなものですが、バッファはEmacs Lispでは文字列のようには使用できませんし、適用できる操作も異なっていま す。例えば、テキストの"挿入"ということを考えてみると、文字列への場合は 部分文字列の結合が必要となり、その結果は完全に新しい文字列オブジェクトに なってしまうのに対し、バッファへのテキストの挿入は非常に効率的です。

個々のバッファはポイント(point)と呼ばれる指定位置をもっています (see section 位置)。どのようなときにでも、一つのバッファが カレント・バッファ(current buffer)になっています。ほとんどの 編集コマンドはカレント・バッファのポイントの付近の内容に対して作用します。 します。このマニュアルでは、一章を割いて、これらの関数の説明に あてています(see section テキスト)。

他のデータ構造のいくつかは個々のバッファと関連しています。

ローカル・キーマップとローカル変数のリストは、グローバルなバインドや グローバル変数の値に対し個別に優先するエントリを含んでいます。 これらはプログラムを実際に変えずに、 種々のバッファにおけるプログラムの振る舞いをカスタマイズするために 使用されます。

バッファは間接(indirect)にすることができ、それは別のバッファの テキストを共有することを意味します。See section 間接バッファ

バッファはリード構文をもちません。バッファは、バッファの名前を示す ハッシュ表記で印字します。

 
(current-buffer)
     ⇒ #<buffer objects.texi>

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.2 マーカ型

マーカ(marker)は特定のバッファ内の位置を示します。 したがって、マーカは二つの構成要素をもっています。 一つはバッファを指すためのもので、もう一つは位置を指すためのものです。 バッファのテキストの変化があっても、マーカが常にバッファ内の同じ二つの 文字の間を指していることが保証されるように、位置の値は自動的に再配置 されます。

マーカはリード構文をもちません。マーカはハッシュ表記で印字し、 それには現在の文字の位置と、バッファの名前がつきます。

 
(point-marker)
     ⇒ #<marker at 10779 in objects.texi>

マーカのテスト、作成、コピー、移動の方法に関しては、See section マーカ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.3 ウィンドウ型

ウィンドウ(window)はEmacsがバッファを表示するために使用する 端末画面の一部を表します。すべてのウィンドウは、一つの対応した バッファをもち、その内容がウィンドウに表示されます。逆に、与えられた バッファは、一つのウィンドウに表示したり、ウィンドウに表示しなかったり、 複数のウィンドウに表示するようにすることができます。

多くのウィンドウが同時に存在できますが、どのようなときでも、 一つのウィンドウが選択されたウィンドウ(selected window)と称されます。 これは、Emacsがコマンドを受けつける状態のときに、カーソルが(普通)表示さ れているウィンドウです。選択されたウィンドウは、普通、カレント・バッファを 表示していますが、必ずしもそういうわけではありません。

ある画面上のウィンドウは、フレームにグループ化されます。 個々のウィンドウは、ただ一つのフレームに属します。See section フレーム型

ウィンドウはリード構文をもちません。ウィンドウは、ハッシュ表記で印字 し、それにはウィンドウ番号と、表示しているバッファの名前がつきます。 ウィンドウに表示されているバッファは頻繁に変わるので。ウィンドウを一意に 識別するために、ウィンドウ番号が用意されています。

 
(selected-window)
     ⇒ #<window 1 on objects.texi>

ウィンドウに対する関数の説明は、See section ウィンドウ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.4 フレーム型

フレーム(frame)は、一つ以上のEmacsウィンドウを含む長方形の 画面です。フレームは最初はメインとなるウィンドウを一つ含みます(ミニバッファ・ ウィンドウもあるかもしれませんが)。そのウィンドウは、 より小さなウィンドウに垂直または水平に再分割することができます。

フレームはリード構文をもちません。 フレームはハッシュ表記で印字し、それにはフレームのタイトル、 主記憶のアドレス(フレームを一意に識別するために有用)がつきます。

 
(selected-frame)
     ⇒ #<frame xemacs@mole.gnu.ai.mit.edu 0xdac80>

フレームに対する関数の説明は See section フレーム


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.5 ウィンドウ構成型

ウィンドウ構成(window configuration)は、フレーム内のウィンドウの位置、 サイズ、内容に関する情報を記憶し、後でウィンドウを同じ配置で再生できる ようにします。

ウィンドウ構成はリード構文をもちません。 ウィンドウ構成は`#<window-configuration>' のように印字します。ウィンドウ構成に関係する いくつかの関数の説明は、See section ウィンドウ構成


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.6 プロセス型

プロセス(process)という用語は普通、実行しているプログラムを意味します。 Emacs 自身は、この種のプロセスで動作しています。 しかし、Emacs Lispにおいてプロセスとは、Emacsプロセスによって作成 されたサブプロセスを示しているLispオブジェクトです。 シェル、GDB、ftp、コンパイラなどのプログラムは、Emacsのサブプロセスで 動作し、Emacsの機能を拡張します。

Emacsのサブプロセスは、Emacsからのテキスト入力を受け取り、 それ以降の操作のためにEmacsにテキスト出力を返します。 Emacsはサブプロセスにシグナルも送ることができます。

プロセス・オブジェクトはリード構文を持ちません。 プロセス・オブジェクトは、ハッシュ表記で印字し、それにはプロセスの 名前がつきます。

 
(process-list)
     ⇒ (#<process shell>)

プロセスを作成する関数、プロセスを消去する関数、プロセスに関する情報を 返す関数、入力やシグナルを送る関数、出力を受け取る関数についての 情報は、See section プロセス


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.7 ストリーム型

ストリーム(stream)は文字の並びのソース、またはシンクとして使用する オブジェクトです。ソースは入力に文字を供給するためのものであり、 シンクは出力として文字を受け取るためのものです。多くの異なる型 (マーカ、バッファ、ストリング、関数)は、この方法で使用されます。 典型的には、入力ストリーム(文字ソース)は、キーボード、バッファ、 またはファイルから文字を受け取り、出力ストリーム(文字シンク)は、 バッファ(たとえば`*Help*'バッファのようなもの)、 またはエコー領域に文字を送ります。

オブジェクトnilは、その他の意味に加えて、ストリームとしても 使用できます。それは変数standard-input またはstandard-outputの値を表してします。 また、ストリームとしてのオブジェクトtは、ミニバッファ (see section ミニバッファ)を使用した入力、または、エコー領域 (see section エコー領域)を指定した出力を指定します。

ストリームは、特殊な印字表現やリード構文を持たず、 そのプリミティブ型がなんであれ、その型として印字されます。

解析や印字の関数など、ストリームに関係する関数の説明は、 See section Lispオブジェクトの読込みと印字


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.8 キーマップ型

キーマップ(keymap)はユーザによってタイプされるキーをコマンドに 割り当てます。この割り当てはユーザのコマンド入力がどのように実行されるか を制御します。キーマップは実際にはCARがシンボルkeymap であるリストです。

キーマップの作成、前置キーの処理、グローバル・キーマップと ローカル・キーマップ、キー・バインドの変更に関する情報は、See section キーマップ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.9 構文テーブル型

構文テーブル(syntax table)は256個の整数のベクタです。 ベクタの個々の要素は、ある文字がバッファ上に現れた場合に、どのように解釈 されるかを定義します。例えば、Cモード(see section 主モード)では 文字`+'は句読点ですが、Lispモードではシンボルに使用できる 文字です。これらのモードは、構文テーブル内の添字43に ある`+'のためのエントリを変更することによって、異なる解釈 を指定します。

構文テーブルは、バッファ内のテキストをスキャンするためだけに 使用され、Lisp式の読み込みには使用されません。式の読み込みにLisp インタプリタが使用するテーブルはEmacsのソース・コードに組み込まれて いて、変更することはできません。したがって、リストの範囲を 定める`('`)'の代わりに`{'`}'を 使用できるようにすることはできません。

構文クラスと構文テーブルの更新方法に関する詳細は、 See section 構文テーブル


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.10 表示テーブル型

表示テーブル(display table)は、個々の文字コードを 表示する方法を指定します。個々のバッファおよび個々のウィンドウは、それ自身の 表示テーブルをもつことができます。表示テーブルは 実際には、長さ262のベクタです。See section 表示テーブル


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.11 オーバレイ型

オーバレイ(overlay)は、バッファの一部分の表示上の外観の一時的 な変更を指定します。それはバッファのある範囲の境界を定めるマーカを含み、 加えて属性リスト(属性の名前と値を交互に要素としているリスト)も 含んでいます。オーバレイは一時的に異なった表示スタイルで バッファの一部を表示するために使用されます。 オーバレイは、リード構文をもたず、バッファ名と位置の範囲のついた ハッシュ表記で印字します。

オーバレイの作成、使用の方法に関しては、See section オーバレイ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 型述語

Emacs Lispインタプリタ自身は、関数が呼ばれたときに渡された実引数に 対して型チェックを行ないません。型チェックが行えないのは、 Lispの関数の引数に、他のプログラミング言語にあるようなデータ型の 宣言がないためです。 したがって、各実引数が、その関数が利用できる型に属しているかを テストするのは、個々の関数の責任です。

すべての組込み関数は、適当なときにその実引数の型をチェックし、 引数が不正な型であれば、エラーwrong-type-argumentを 発します。例えば、以下は+が扱うことのできない引数を渡した場合 に何が起きるかを示しています。

 
(+ 2 'a)
     error--> Wrong type argument: integer-or-marker-p, a

型ごとに異なった処理を行うプログラムが欲しいのであれば、あなたは 明示的に型チェックを行なわなければなりません。オブジェクトの型を チェックする最もありふれた方法は、型述語(type predicate)関数を 呼び出すことです。Emacsは、型の組合せのための述語の他にも、個々の型の ための型述語を持っています。

型述語関数は、一つの引数をとります。その引数が適切な型に属していれば tを返し、そうでなければnilを返します。 述語関数についての一般的なLispの慣例にしたがって、ほとんどの型述語 の名前は`p'で終ります。

以下は、リストであることをチェックする述語listpと、 シンボルであることをチェックするsymbolpを使用した例です。

 
(defun add-on (x)
  (cond ((symbolp x)
         ;; xがシンボルであれば、それをlistに加える。
         (setq list (cons x list)))
        ((listp x)
         ;; xがリストであれば、それをlistに加える。
         (setq list (append x list)))
        (t
         ;; シンボルとリストだけを処理する。
         (error "Invalid argument %s in add-on" x))))

以下は、既定義の型述語をアルファベット順でならべた一覧で、 詳細な情報の参照先を示しています。

atom

See section atom

arrayp

See section arrayp

bufferp

See section bufferp

byte-code-function-p

See section byte-code-function-p

case-table-p

See section case-table-p

char-or-string-p

See section char-or-string-p

commandp

See section commandp

consp

See section consp

floatp

See section floatp

frame-live-p

See section frame-live-p

framep

See section framep

integer-or-marker-p

See section integer-or-marker-p

integerp

See section integerp

keymapp

See section keymapp

listp

See section listp

markerp

See section markerp

wholenump

See section wholenump

nlistp

See section nlistp

numberp

See section numberp

number-or-marker-p

See section number-or-marker-p

overlayp

See section overlayp

processp

See section processp

sequencep

See section sequencep

stringp

See section stringp

subrp

See section subrp

symbolp

See section symbolp

syntax-table-p

See section syntax-table-p

user-variable-p

See section user-variable-p

vectorp

See section vectorp

window-configuration-p

See section window-configuration-p

window-live-p

See section window-live-p

windowp

See section windowp

オブジェクトの型をチェックする最も一般的な方法は、関数type-of を呼び出すことです。個々のオブジェクトは、ただ一つのプリミティブ型 に属していることを思い出してください。type-ofは、その一つ をあなたに知らせます(see section Lisp のデータ型)。しかし、type-of は非プリミティブ型については何も知りません。たいていの場合、 type-ofよりも型述語を使用したほうが便利です。

Function: type-of object

この関数は、objectのプリミティブ型の名前を表すシンボルを返 します。その値はsymbol, integer, float, string, cons, vector, marker, overlay, window, buffer, subr, compiled-function, window-configuration, あるいは processのうちの一つです。

 
(type-of 1)
     ⇒ integer
(type-of 'nil)
     ⇒ symbol
(type-of '())    ; () is nil.
     ⇒ symbol
(type-of '(x))
     ⇒ cons

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 等価述語

ここでは、任意の二つのオブジェクトの等価性をテストする二つの関数 について述べます。それとは別に、特定の型(文字列など)のオブジェクトの 等価性をテストする関数もあります。そのような述語に関しては、その データ型について述べられている適切な章を参照してください。

Function: eq object1 object2

この関数はobject1object2が同じオブジェクトであれば、 tを返し、そうでなければnilを返します。 「同じオブジェクト」であるということは、一方を変更すると他方にそれと 同じ変更が反映されることを意味しています。

eqobject1object2が同じ値をもつ整数であれば、 tを返します。また、シンボル名は、普通一意であるので、 引数が同じ名前をもつシンボルであれば、それらはeqです。 その他の型(リスト、ベクタ、文字列など)では、内容または要素が同じである 二つ引数が、必ずしも互いに等価であるわけではありません。 それらが同じオブジェクトである場合にかぎって、それらは eq です。

(make-symbol関数は標準のobarray にinternされていないシンボルを返します。 internされていないシンボルが使用されているときには、 シンボル名はもう一意ではありません。同じ名前をもつ別々のシンボル はeqではありません。See section シンボルの作成と intern。)

 
(eq 'foo 'foo)
     ⇒ t

(eq 456 456)
     ⇒ t

(eq "asdf" "asdf")
     ⇒ nil

(eq '(1 (2 (3))) '(1 (2 (3))))
     ⇒ nil

(setq foo '(1 (2 (3))))
     ⇒ (1 (2 (3)))
(eq foo foo)
     ⇒ t
(eq foo '(1 (2 (3))))
     ⇒ nil

(eq [(1 2) 3] [(1 2) 3])
     ⇒ nil

(eq (point-marker) (point-marker))
     ⇒ nil
Function: equal object1 object2

この関数はobject1object2が同じ成分をもっているならば、 tを返し、そうでなければnilを返します。 eqが、その引数が同一のオブジェクトであるかをテストするの に対し、equalは、要素が同一であるかを判別するために、同一では ない引数の中身を調べていきます。したがって、もし二つのオブジェクト がeqであるならば、それらはequalですが、 逆は常に真とはかぎりません。

 
(equal 'foo 'foo)
     ⇒ t

(equal 456 456)
     ⇒ t

(equal "asdf" "asdf")
     ⇒ t
(eq "asdf" "asdf")
     ⇒ nil

(equal '(1 (2 (3))) '(1 (2 (3))))
     ⇒ t
(eq '(1 (2 (3))) '(1 (2 (3))))
     ⇒ nil

(equal [(1 2) 3] [(1 2) 3])
     ⇒ t
(eq [(1 2) 3] [(1 2) 3])
     ⇒ nil

(equal (point-marker) (point-marker))
     ⇒ t

(eq (point-marker) (point-marker))
     ⇒ nil

文字列の比較では大文字、小文字が区別され、文字列中の文字の他にも テキスト属性を考慮に入れます。テキスト属性を比較することなく、 二つの文字列の文字を比較するためにはstring=を使用して ください(see section 文字・文字列の比較)。

 
(equal "asdf" "ASDF")
     ⇒ nil

二つの別々のバッファは、たとえその内容が同じであっても、equalに なることはありません。

等価性のテストは再帰的に実装されているので、循環リストでは (エラーをもたらす)無限の再帰を引き起こすかもしれません。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.