by shigemk2

当面は技術的なことしか書かない

対話によるCommon Lisp入門 39 eq eql equal

数の比較が=
二つのシンボルの比較はeq
二つのアトムの比較はeql
二つのリストの比較はequal

故に eq < eql < equal の順に、比較対象は大きくなっていく。
つまり、eqで等しいものはeqlでもequalでも等しいが、equalで等しいものは
eqで等しいとは限らない。

=の引数が数以外ならエラーが起きるが、
eqにリストを入れてもエラーにはならない。
(特に初心者にとっては)eq eqlで比較をするのは危険である。
なぜかというと、eqは二つのデータが計算機のメモリー内で同じ場所(アドレス)にあるときに
限って等しいと見做すからである。故に、二つのリストが見掛け上同じに見えても違う場所にある事はありうる。

[1]> (= 3 3.0)
T
[2]> (eq 'miso 'miso)
T
[3]> (eql 'miso 'miso)
T
[4]> (eql 3 3)
T
[5]> (equal '(miso sio) '(miso sio))
T
[6]> (equal '(miso sio) '(sio miso))
NIL
[7]> (= 3 'sun)

*** - =: SUN is not a number
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead.
ABORT          :R2      Abort main loop
Break 1 [8]> :a
[9]> (eq '(miso sio) '(miso sio))
NIL
[10]> (equal '(miso) 'miso)
NIL