Previous: Type Predicates, Up: Lisp Data Types


2.6 同値述語

2つのオブジェクトの同値関係を調べる2つの関数を説明します。 文字列などの特定のオブジェクトが同値であるかを調べる関数群もあります。 これらの述語については、データ型を述べている適切な章を参照してください。

— Function: eq object1 object2

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

eqは、object1object2が同じ値の整数であると 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
— Function: equal object1 object2

この関数は、 object1object2が等しい要素を持てば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の検査は再帰で実装されているので、 リストに循環があると無限再帰を引き起こし(エラーになり)ます。