インスタンスからスロット名を取得する - 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)