Previous: , Up: Lisp Data Types   [Contents][Index]


2.7 Equality Predicates

ここでは、2つのオブジェクトの同一性をテストする関数を説明します。(たとえば文字列などの)特定の型のオブジェクト同士で、内容の同一性をテストするのは、別の関数を使用します。これらの述語にたいしては、そのデータ型を説明する、適切なチャプターを参照してください。

Function: eq object1 object2

この関数はobject1object2が同じオブジェクトの場合はt、それ以外はnilをreturnします。

object1object2が、同じ値をもつ整数の場合、これらは同じオブジェクトと判断されます(eqtをreturnします)。object1object2が、同じ名前のシンボルの場合、通常は同じオブジェクトです。しかし例外もあります。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
Function: equal object1 object2

この関数は、object1object2が同じ構成要素をもつ場合は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つのコンスセルxyを与えると、(equal x y)は、以下の式の両方がtをreturnする場合に限り、tをreturnします:

(equal (car x) (car y))
(equal (cdr x) (cdr y))

これは再帰処理なので、循環するリストがあると無限再帰となります(エラーとなります)。

Function: equal-including-properties object1 object2

この関数はすべてのケースにおいてequalと同様に振る舞いますが、2つの文字列がequalになるためには、それらが同じテキストプロパティーをもつ必要があります。

(equal "asdf" (propertize "asdf" 'asdf t))
     ⇒ t
(equal-including-properties "asdf"
                            (propertize "asdf" 'asdf t))
     ⇒ nil

Previous: , Up: Lisp Data Types   [Contents][Index]