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