Самоанализ класса в Common Lisp - PullRequest
11 голосов
/ 12 апреля 2009

Java-класс java.lang.Class имеет метод getDeclaredFields, который будет возвращать все поля в данном классе. Есть ли что-то похожее для Common Lisp? После ознакомления с инструкциями в «Успешном Лиспе», глава 10, я наткнулся на некоторые полезные функции, такие как description, Inspect и Symbol-Plist (http://www.psg.com/~dlamkins/sl/chapter10.html). Но ни одна из них не делает то, что делает getDeclaredFields.

Ответы [ 2 ]

11 голосов
/ 12 апреля 2009

Вы должны использовать class-slots и / или class-direct-slots (оба из CLAP Metaobject Protocol, MOP). class-slots возвращает все слоты, присутствующие в данном классе, а class-direct-slots возвращает все слоты, объявленные в определении класса.

Различные реализации lisp реализуют MOP немного по-разному; используйте close-mop пакет, чтобы иметь единый интерфейс с MOP.

Пример:

(defclass foo ()
  (foo-x))

(finalize-inheritance (find-class 'foo)) ;this is needed to be able to query class slots and other properties. Or, class is automatically finalized when its first instance is created

(class-slots (find-class 'foo))
=> (#<STANDARD-EFFECTIVE-SLOT-DEFINITION FOO-X>)

(slot-definition-name (first (class-slots (find-class 'foo))))
=> FOO-X

Пример:

(defun inspect (( object standard-object))
  (inspect-rec (class-slots (class-of object)) object) )


(defun inspect-rec (slots o)
  ( if(atom slots) ()
   (let ((sn (slot-definition-name (car slots)))) (cons (list sn '=> ( slot-value o sn) )  ( inspect-rec (cdr slots) o)))))
6 голосов
/ 12 апреля 2009

Я думаю, вы ищете протокол MetaObject для CL .

...