change-class

change-classってクラス入れ替えるって言ってもsetqし直す(新規にインスタンスを作る)だけでしょ?何のためにあるの?とか思っていたのだけど、それだけのために存在するのもおかしいと思って色々試してみた。同じ名前のスロットがあると値を引き継いでくれるのですね。
以下ギニューとカカロットの戦闘シーン

;; ギニュー
CL-USER> (defclass ginu ()
           ((x :accessor ginu-x :initform 'ginu)))
#<STANDARD-CLASS GINU>
;; 孫悟空
CL-USER> (defclass goku ()
           ((x :accessor goku-x :initform 'goku)
            (y :accessor goku-y :initform 'son)))
#<STANDARD-CLASS GOKU>

CL-USER> (setq g (make-instance 'ginu))
#<GINU #x1A2EB49D>
CL-USER> (ginu-x g)
GINU


;; チェーーーンジ!!!!
CL-USER> (change-class g 'goku)
#<GOKU #x1A2EB49D>
CL-USER> (goku-x g)
GINU
CL-USER> (goku-y g)
SON

;; CL-USER> (describe g)

CL-USER> (ginu-x g)
; Evaluation aborted


スロット名だけが判断基準であって、アクセッサが同名でも意味ない

CL-USER> (defclass foo ()
           ((a :accessor slot1 :initarg :slot1)))
#<STANDARD-CLASS FOO>
CL-USER> (defclass bar ()
           ((b :accessor slot1 :initform 20)))
#<STANDARD-CLASS BAR>

CL-USER> (setq a (make-instance 'foo :slot1 30))
#<FOO #x1A75B3A9>
CL-USER> (slot1 a)
30

CL-USER> (change-class a 'bar)
#<BAR #x1A75B3A9>
CL-USER> (slot1 a)
20