このパッケージは2個のCommon Lisp述語、eqlとequalpを定義
する。
この関数はほとんどeqと同じだが、aとbが同じ型の
数なら数の等値性を比較する(eqではなくequalのように)点が
異なる。これはEmacs 19のような浮動小数点数サポートとともに
コンパイルされた版のEmacsでのみ相違が生じる。Emacsの浮動小数点数は
単なるコンスセルのように割り当てられたオブジェクトであり、それは
(eq 3.0 3.0)は真である必要がないことを意味する—2個の
3.0が別々に割り当てられたら、数は同じだがポインタは異なる。
しかし(eql 3.0 3.0)は常に真である。
引数の型はマッチしなければならないので、(eql 3 3.0)は
なお偽である。
Emacs整数は割り当てられているのではなく“ダイレクト”であり、それは
基本的に(eq 3 3)は常に真になることを意味することに注意せよ。
したがってeqとeqlは浮動小数点に関係のある場合のみ
異なって振る舞い、浮動小数点数をサポートしない版のEmacsでは
区別がつかない。
正と負の0の扱いにCommon Lispとわずかな不一致がある。いくつかの
マシンは、特にIEEE標準算術のものは、+0と-0を別の値として
表現する。標準は(= 0.0 -0.0)は常に真だと指定しており、
これはまったくEmacs LispとCommon Lispが行なうことなので、通常これは
問題にならない。しかしCommon Lisp標準は(eql 0.0 -0.0)や
(equal 0.0 -0.0)はIEEE的マシンでは偽になるべきだと述べている;
Emacs Lispはこれを行なわず、事実Emacs Lispで2種類の0を区別する既知の
方法はformatして負号をチェックすることだけである。
この関数はequalのより柔軟な版である。特に、それは文字列を
大文字小文字を区別せずに比較し、数を型を考慮せずに比較する(そのため
(equalp 3 3.0)は真である)。ベクタとコンスは再帰的に比較される。
他の全オブジェクトはequalと同様に比較される。
この関数はいくつかの点でCommon Lispのequalpと異なる。第1に、
Common Lispのequalpは文字も大文字小文字を区別せずに
比較するが、Emacsは整数と文字を区別しないのでこのパッケージには
非実用的である。Emacs Lispでは文字列はあまりベクタ的ではないという
考え方を保ち、このパッケージのequalpは文字列と整数のベクタも
比較しない。最後に、Common Lispのequalpはハッシュ表を順序を
考慮せずに比較するが、このパッケージはハッシュ表を単純にその下にある
構造に関して(このことはLucid Emacs 19のハッシュ表はベクタであり、他の
ハッシュ表はリストであることを意味する)比較する。
Common Lispの関数memberとassocは要素の比較にeqlを
使っているが、Emacs LispはMacLispの伝統に従いこれらの2個の関数に
equalを使っていることにも注意せよ。Emacsでは比較にeqlを
使う関数を得るにはmember*やassoc*を使うこと。