構造体のcopy-関数は中身までコピーしてくれない

構造体のcopy-関数で中身のベクタもコピーされると思ったら大間違いという話。

(defstruct s (vec #(0000) :type simple-array))

(defparameter s1 (make-s))
(defparameter s2 (copy-s s1))

(eq s1 s2) ; => NIL
(eq (s-vec s1) (s-vec s2)) ; => T

copy-sした上でベクタだけcopy-seqしたもので上書きすればいい。

(defun fullcopy-s (obj)
  (let ((clone (copy-s obj)))
    (setf (s-vec clone) (copy-seq (s-vec obj)))
    clone))

(defparameter s3 (fullcopy-s s1))

(eq s1 s3) ; => NIL
(eq (s-vec s1) (s-vec s3)) ; => NIL

しかしいちいちこれを書くのはめんどさい。何かラッパーが欲しい