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