2007/09/07

[Common Lisp][MOP] ダイレクトスロットを取得する

class-slots でスーパークラスのスロットを含めたスロットを取得できますが、スーパークラスのスロットを含まずそのクラスで直に定義されたスロット(direct-slot)だけを取得するには class-direct-slots を使用します。
なお、スロットはインスタンスではなくクラスにくっついているものなので、スロット単体からはスロットの値を取得することはできません。
slot-definition-name でスロットからスロット名を取得して slot-value で値を取得します。
もちろん、スロット名が最初からわかっていれば (slot-value instance 'bar-slot) かアクセッサで (bar-slot instance) とすればよいです。

(use-package :sb-mop)

(defclass foo ()
((foo-slot :accessor foo-slot
:initform "foo のスロット")))

(defclass bar (foo)
((bar-slot :accessor bar-slot
:initform "bar のスロット")))

(let* ((instance (make-instance 'bar))
(direct-slots (class-direct-slots (class-of instance))))
(format t "direct-slots => ~a~%" direct-slots)
(format t "スロットの値 => ~a~%"
(slot-value instance (slot-definition-name (car direct-slots)))))
;; 出力結果
;; direct-slots => (#<STANDARD-DIRECT-SLOT-DEFINITION BAR-SLOT>)
;; スロットの値 => bar のスロット

0 件のコメント: