Самоанализ класса в языке Common LISP

Я упустил тот факт, что admin_chat_id был вложен в службу. Таким образом, сброс «admin_chat_id» привел к сбросу несуществующего значения. Правильным решением является использование полного пути: "service.admin_chat_id".

11
задан Múna 20 March 2014 в 17:06
поделиться

2 ответа

Вы должны использовать class-slots и / или class-direct-slots (оба из CLOS 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)))))
11
ответ дан 3 December 2019 в 07:14
поделиться

Я думаю, что вы ищете MetaObject Protocol для CL .

6
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: