このパッケージは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*
を使うこと。