2007/09/11

[Common Lisp][MOP] サブクラスのリストを取得する

直接のサブクラスを取得するには class-direct-subclasses を使います。
class-direct-subclasses を再帰的に呼出すことにより全てのサブクラスを取得することができます。
COLS では全てのクラスは t を継承しているので、t のサブクラスを求めることによって、定義されている全クラスを取得することができます。
SBCL では655個、OpenMCL では520個のクラスが定義されていました。

#+sbcl (use-package :sb-mop)

(defclass foo ()
())

(defclass bar (foo)
())

(defclass baz (bar)
())

(class-direct-subclasses (find-class 'foo))
;; => (#<STANDARD-CLASS BAR>)

(labels ((subclasses (class)
(cons class
(mapcan #'subclasses (class-direct-subclasses class)))))
;; cdr で自分自身を除きます。
;; foo のかわりに t を指定するば t を除く全クラスが返ってきます。
(cdr (remove-duplicates (subclasses (find-class 'foo)))))
;; => (#<STANDARD-CLASS BAR> #<STANDARD-CLASS BAZ>)

0 件のコメント: