インスタンスからスロット名を取得する - lisp-cookbook-ja/common-lisp GitHub Wiki
ポータブルなMOPライブラリであるcloser-mopを使うことで、インスタンスからクラスのスロット名を取得できる。
(ql:quickload :closer-mop)
(defclass person () ((name :initarg :name)
(email :initarg :email)
(age :initarg :age)))
(defparameter person1 (make-instance 'person))
(mapcar #'c2mop:slot-definition-name
(c2mop:class-slots (class-of person1)))
; => (NAME EMAIL AGE)
また、closer-mopを使ったユーティリティ集であるfare-mopを使っても同じことができる。
(ql:quickload :fare-mop)
(fare-mop:collect-slots person1)
; => nil 束縛されてないスロットは無視される
(defparameter person2 (make-instance 'person :name "foo" :email "[email protected]" :age 30))
(fare-mop:collect-slots person2)
; => (:NAME "foo" :EMAIL "[email protected]" :AGE 30)