Java java.lang.Class класс имеет метод getDeclaredFields, который будет возвращать все поля в данном классе. Есть ли что-то подобное для Common Lisp? Я наткнулся на некоторые полезные функции, такие как описать, осмотреть и отобразить символ после чтения, прочитав инструкции в Successful Lisp, глава 10 (http://www.psg.com/~dlamkins/sl/chapter10.html). Но никто из них не делает то, что делает getDeclaredFields.
Интроспекция класса в Common Lisp
Ответ 1
Вы должны использовать класс-слоты и/или классы-прямые-слоты (оба из CLOS Metaobject Protocol, MOP). class-slots возвращает все слоты, которые присутствуют в данном классе, а класс-direct-slots возвращает все слоты, объявленные в определении класса.
Различные реализации lisp реализуют MOP несколько иначе; используйте closer-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)))))
Ответ 2
Я думаю, что вы ищете Протокол MetaObject для CL.