Previous: , Up: 述語   [Contents][Index]


3.2 等値の述語

このパッケージは2個のCommon Lisp述語、eqlequalpを定義 する。

Function: eql a b

この関数はほとんどeqと同じだが、abが同じ型の 数なら数の等値性を比較する(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)は常に真になることを意味することに注意せよ。 したがってeqeqlは浮動小数点に関係のある場合のみ 異なって振る舞い、浮動小数点数をサポートしない版の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して負号をチェックすることだけである。

Function: equalp a b

この関数は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の関数memberassocは要素の比較にeqlを 使っているが、Emacs LispはMacLispの伝統に従いこれらの2個の関数に equalを使っていることにも注意せよ。Emacsでは比較にeqlを 使う関数を得るにはmember*assoc*を使うこと。