Common Lispのイコール(eq eql equal equalp)

どの言語にも2つの値(オブジェクト)が等しいかどうかという判断が必ずあると思う。例えばxとyの値が等しいかどうかっていう処理はよくでてくるはずである。当然Common Lispにもその判断を行うための方法が用意されていて、Common Lisptでは「EQ、EQL、EQUAL、EQUALP」という関数で定義されている。
名前で区別つかないので、絶対忘れる系。なので、メモっておく。また、Common LispではNILが偽で、それ以外のものはすべて真となる。ただ、空のリスと'()もNILと同等のようだ。

EQ(オブジェクト同一性)

CL-USER> (eq 10 10)
T

ただし、この式が真になるか偽になるかはLispの処理系によるらしい。うーん。とりあえずこいつはあんまり使うこと無いのかな。

EQL

比較するオブジェクトのクラスと値までみて同じかどうか判断する

CL-USER> (eql 10 10)
T
CL-USER> (eq 10 10.0)
NIL

1つ目は真とるなるが、2つ目は偽となる。これらの2つは整数と浮動小数点を表すクラスのため別物とみなされるらしい。実践Common Lispでは、EQは使わずにEQLを使うことにしてるようだ。

EQUAL

同じ構造でかつ、同じ内容のListを同一とみなしたいときに利用する。

CL-USER> (equal '(1 2 (3 4)) '(1 2 (3 4)))
T
CL-USER> (equal '(1 2 (3 4)) '(1 2 3 4))
NIL

こういうことだと思われるw

EQUALP

同じアルファベットで大文字小文字が違っていても同一とみなされる。また、数値の場合1と1.0も同一とみなされる。(一番基準がゆるい)

CL-USER> (equalp "aiueo" "AiUeO")
T
CL-USER> (equalp 1 1.0)
T