構造体の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
しかしいちいちこれを書くのはめんどさい。何かラッパーが欲しい