CLOSでslotにアクセス
自分は、CLOSでメソッドを書いてるとwith-slots/with-accessorを多用します。
slotが増えてくるとめんどいので、with-all-slotsなるモノがあればいいなと妄想。
sbclで実装してみました。
slotを確定させるためにクラスを明にfinalize-inheritanceしないとならないのが難点。
(defmacro with-all-slots ((obj class &optional prefix) &body body) (let ((all-slots (mapcar #'sb-mop:slot-definition-name (sb-mop:class-slots (find-class class))))) `(with-slots (,@(mapcar #'(lambda (slot) (list (intern (concatenate 'string (string (or prefix "")) (string slot))) slot)) all-slots)) ,obj ,@body))) (eval-when (:compile-toplevel :load-toplevel :execute) (defclass hoge () (a b c)) (defclass huga (hoge) (d e f)) (sb-mop:finalize-inheritance (find-class 'hoge)) (sb-mop:finalize-inheritance (find-class 'huga))) (defun aa (hu1 hu2) (with-all-slots (hu1 huga hu1.) (with-all-slots (hu2 huga hu2.) (setf hu1.f 'f hu2.f 'ff) (setf hu1.a hu2.f)))) (let ((h1 (make-instance 'huga)) (h2 (make-instance 'huga))) (aa h1 h2) (slot-value h1 'a)) ;; => FF