Domanda

class java.lang.Class di Java ha un metodo getDeclaredFields che restituirà tutti i campi in una data classe. C'è qualcosa di simile per Common Lisp? Mi sono imbattuto in alcune funzioni utili come descrivere, ispezionare e simbolo-plist dopo aver letto provando le istruzioni in Lisp di successo, capitolo 10 ( http://www.psg.com/~dlamkins/sl/chapter10.html ). Ma nessuno di loro fare ciò che fa getDeclaredFields.

È stato utile?

Soluzione

Si dovrebbe usare Class-slot e / o di classe-slot diretti (entrambi sono da CLOS Metaobject protocollo, MOP). CLASS-slots restituisce tutti gli slot che sono presenti in data classe, e di classe-Direct-slots restituisce tutti gli slot sono dichiarati nella definizione della classe.

differenti implementazioni lisp implementano MOP leggermente diverso; utilizzare pacchetto più vicino-mop di avere un'interfaccia uniforme per MOP.

Esempio:

(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

Esempio:

(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)))))

Altri suggerimenti

Credo che tu stai cercando il MetaObject Protocollo per CL .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top