2007/09/05

[Common Lisp][MOP] スロットのリストを取得する

class-slots によりスーパークラスのスロットを含めたスロット(standard-effective-slot-definition のインスタンス)のリストを取得できます。
SBCL ですが、何故かインスタンスを生成しないとスロットのリストが取得できませんでした。

(use-package :sb-mop)         ; MOP のパッケージを使えるようにしておく

(defclass foo ()
((foo-slot)))

(defclass bar (foo)
((bar-slot)))

(make-instance 'bar) ; インスタンスを作成しないとうまく class-slots が動かない
(class-slots (find-class 'bar))
;; => (#<STANDARD-EFFECTIVE-SLOT-DEFINITION FOO-SLOT>
;; #<STANDARD-EFFECTIVE-SLOT-DEFINITION BAR-SLOT>)

;; スロット名のリストを取得する
(mapcar #'slot-definition-name (class-slots (find-class 'bar)))
;; => (FOO-SLOT BAR-SLOT)

0 件のコメント: