2010-06-21 13 views

Respuesta

5

Hay dos partes para hacer esto, al menos en mi solución, sin embargo, necesitará esta función (gracias a los chicos de CL-prevalencia de esta (advierten LLGPL)

(defun get-slots (object) 
    ;; thanks to cl-prevalence 
    #+openmcl 
    (mapcar #'ccl:slot-definition-name 
     (#-openmcl-native-threads ccl:class-instance-slots 
     #+openmcl-native-threads ccl:class-slots 
     (class-of object))) 
    #+cmu 
    (mapcar #'pcl:slot-definition-name (pcl:class-slots (class-of object))) 
    #+sbcl 
    (mapcar #'sb-pcl:slot-definition-name (sb-pcl:class-slots (class-of object))) 
    #+lispworks 
    (mapcar #'hcl:slot-definition-name (hcl:class-slots (class-of object))) 
    #+allegro 
    (mapcar #'mop:slot-definition-name (mop:class-slots (class-of object))) 
    #+sbcl 
    (mapcar #'sb-mop:slot-definition-name (sb-mop:class-slots (class-of object))) 
    #+clisp 
    (mapcar #'clos:slot-definition-name (clos:class-slots (class-of object))) 
    #-(or openmcl cmu lispworks allegro sbcl clisp) 
    (error "not yet implemented")) 

Entonces, para la lectura tendrá que ejecutar esta pieza de código, que establece un medio de la sintaxis que es { type-of-object ((slot-name . slot-value) (slot-name . slot-value) ...)

(set-macro-character 
    #\{ 
    #'(lambda (str char) 
    (declare (ignore char)) 
    (let ((list (read-delimited-list #\} str t))) 
     (let ((type (first list)) 
     (list (second list))) 
     (let ((class (allocate-instance (find-class type)))) 
      (loop for i in list do 
      (setf (slot-value class (car i)) (cdr i))) 
      class))))) 

para la impresión, utilice

(defmethod print-object ((object standard-object) stream) 
    (format stream "{ ~s ~s}" (type-of object) 
     (loop for i in (get-slots object) 
    collect (cons i (slot-value object i))))) 

A *print-readably* es muy recomendable cuando utiliza todos estos métodos. Además, tenga en cuenta que las relaciones circulares no han sido probadas

+3

debe tener una representación externa equilibrada. Actualmente tienes un personaje de apertura, pero no un personaje de cierre correspondiente. Para leer, consulte, por ejemplo, LISTA DELIMITADA. Vea el ejemplo en http://www.lispworks.com/documentation/lw50/CLHS/Body/f_rd_del.htm. –

+0

tal vez tenga razón, pero sirve para mis propósitos, ya que ** debe ** estar ** exactamente ** dos objetos después del { – krzysz00

+0

sí, pero confundirá a todos los editores. s-expresiones deben ser equilibradas. Es un cambio simple de todos modos. –

Cuestiones relacionadas