2つのオブジェクトの同値関係を調べる2つの関数を説明します。 文字列などの特定のオブジェクトが同値であるかを調べる関数群もあります。 これらの述語については、データ型を述べている適切な章を参照してください。
この関数は、object1とobject2が 同一オブジェクトであれば
t
を返し、さもなければnil
を返す。 『同一オブジェクト』とは、 一方を変更すると、他方にも同じ変更が反映されることを意味する。
eq
は、object1とobject2が同じ値の整数であるとt
を返す。 また、シンボル名は、普通、一意であるので、 引数が同じ名前のシンボルであれば、それらはeq
である。 (リスト、ベクトル、文字列などの)それ以外の型の場合、 2つの引数が同じ内容や要素であっても、 互いにeq
であるとは限らない。 それらが同一オブジェクトである場合に限りeq
である。(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関数
make-symbol
は、インターンしたシンボルを返す。 このシンボルは、Lisp式に書いた同じ名前のシンボルと区別される。 名前が同じでも区別されるシンボルはeq
ではない。 see Creating Symbols。(eq (make-symbol "foo") 'foo) ⇒ nil
この関数は、 object1とobject2が等しい要素を持てば
t
を返し、 さもなければnil
を返す。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文字列の比較では大文字小文字を区別するが、テキスト属性は考慮しない。 つまり、文字列内の文字だけを比較する。 文字列の内容がすべてASCIIでなければ、 ユニバイト文字列とマルチバイト文字列が等しいことはない (see Text Representations)。
(equal "asdf" "ASDF") ⇒ nilたとえ内容が同じであっても、 異なる2つのバッファが
equal
であることはない。
equal
の検査は再帰で実装されているので、
リストに循環があると無限再帰を引き起こし(エラーになり)ます。