Previous: Type Predicates, Up: Lisp Data Types [Contents][Index]
ここでは、2つのオブジェクトの同一性をテストする関数を説明します。(たとえば文字列などの)特定の型のオブジェクト同士で、内容の同一性をテストするのは、別の関数を使用します。これらの述語にたいしては、そのデータ型を説明する、適切なチャプターを参照してください。
この関数はobject1とobject2が同じオブジェクトの場合はt
、それ以外はnil
をreturnします。
object1とobject2が、同じ値をもつ整数の場合、これらは同じオブジェクトと判断されます(eq
はt
をreturnします)。object1とobject2が、同じ名前のシンボルの場合、通常は同じオブジェクトです。しかし例外もあります。Creating Symbolsを参照してください。(リスト、ベクター文字列などの)他の型にたいしては、同じ内容(または要素)の2つの引数が、両者eq
である必要はありません。これらが同じオブジェクトの場合だけeq
であり、その場合は、一方の内容を変更すると、もう一方の内容にも同じ変更が反映されます。
(eq 'foo 'foo) ⇒ t
(eq 456 456) ⇒ t
(eq "asdf" "asdf") ⇒ nil
(eq "" "") ⇒ t ;; この例外は省スペースのためにEmacs Lispが ;; ただ1つのマルチバイトの空文字列を作成するためです。
(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
make-symbol
関数は、internされていないシンボルをreturnします。これはLisp式内で、その名前を記述したシンボルとは区別されます。同じ名前の、異なるシンボルは、eq
ではありません。Creating Symbolsを参照してください。
(eq (make-symbol "foo") 'foo) ⇒ nil
この関数は、object1とobject2が同じ構成要素をもつ場合はt
、それ以外はnil
をreturnします。eq
は引数が同じオブジェクトなのかテストするのにたいして、equal
は同一でない引数の内部を調べて、それらの要素または内容が同一化をテストします。したがって2つのオブジェクトが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
文字列の比較は大文字小文字を区別しますが、テキストプロパティーは考慮しません — これは文字列内の文字だけを比較します。Text Propertiesを参照してください。テキストプロパティーも比較する場合は、equal-including-properties
を使用します。記述的な理由により、ユニバイト文字列とマルチバイト文字列は、それらが同じ文字シーケンスを含み、それらすべてのコードが0から127(ASCII)、または160から255(8ビットグラフィック
)の場合に限り、equal
です(Text Representationsを参照してください)。
(equal "asdf" "ASDF") ⇒ nil
しかし2つの別のバッファーは、それらのテキスト内容が同じでも、equal
と判断されることはありません。
equal
のテストは再帰により実装されています。たとえば2つのコンスセルxとyを与えると、(equal
x y)
は、以下の式の両方がt
をreturnする場合に限り、t
をreturnします:
(equal (car x) (car y)) (equal (cdr x) (cdr y))
これは再帰処理なので、循環するリストがあると無限再帰となります(エラーとなります)。
この関数はすべてのケースにおいてequal
と同様に振る舞いますが、2つの文字列がequal
になるためには、それらが同じテキストプロパティーをもつ必要があります。
(equal "asdf" (propertize "asdf" 'asdf t)) ⇒ t
(equal-including-properties "asdf" (propertize "asdf" 'asdf t)) ⇒ nil
Previous: Type Predicates, Up: Lisp Data Types [Contents][Index]