2 つの要素の equality を調べる関数が 2 つあります。以下、それらについて述べま す。特定のタイプのオブジェクトの equality を調べる関数も存在しています。それら のプレディケートに関してはそれぞれのタイプに関するチャプターを参照して下さい。
Function: eq object1 object2
この関数は、2 つのオブジェクトが同じオブジェクトである場合 t を返し、そう でない場合 nil を返します。同じ print 名を持つシンボルは常に eq です (uninterned シンボルに関してはどうだろう??)。同じ値の数値は eq です。その 他のオブジェクト(e.g., リスト、ベクトル、ストリング)で同じ要素からなるもの は eq であることもないこともありえます。
また、2 つのオブジェクトが互いに eqである場合、一方を変更すると、その変更 は他方に対しても行なわれます。
(eq 'foo 'foo)
=> t
(eq 456 456)
=> t
(eq "asdf" "asdf")
=> t
(eq '(1 (2 (3))) '(1 (2 (3))))
=> nil
(eq (point-marker) (point-marker))
=> nil
Function: equal object1 object2
この関数は、2 つのオブジェクトが構造的に同じものである場合 t を返し、そう でない場合 nil を返します。 eq なオブジェクト(特に primitive オブジェクト) はまた equal でもあります。リスト、ベクトル、マーカー、ストリングは対応す
る(それぞれの)要素が equal である場合 equal です。
(equal "asdf" "asdf")
=> t
(equal "asdf" "ASDF")
=> nil
(eq '(1 (2 (3))) '(1 (2 (3))))
=> t
(eq [(1 2) 3] [(1 2) 3])
=> t
(eq (point-marker) (point-marker))
=> t