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