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

( defstruct s ( vec #(0000) :type simple-array )) ( defparameter s1 ( make-s )) ( defparameter s2 ( copy-s s1 )) ( eq s1 s2 ) ( eq ( s-vec s1 ) ( s-vec s2 ))

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 ) ( eq ( s-vec s1 ) ( s-vec s3 ))

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