構造体の比較

CommonLispでは、別メモリに確保されている構造体は、equalでもtにならない。

(defstruct hoge name)

(setf a (make-hoge :name "hoge"))
(setf b (make-hoge :name "hoge"))

(equal a b) ; => nil

そこで、使うのがequalp。

(equalp a b) ; => t

定義

COMMON LISP 第2版によると、equalpは次のように定義されている。(構造体回りだけを抜粋)

  • 片方が:typeが指定されていて、もう片方が指定されていないならnilを返す
  • 名前(defstructで指定したやつ)が同じで、対応するスロット(同じ名前のスロット)の内容がequalpならtを返す

と定義されていた。