Si desea hacer que los objetos CLOS se impriman con ceceo comunes (imprimible), ¿cómo hace esto sin usar nada más que imprimir y leer?Hacer que los objetos clos se impriman en lisp
11
A
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
Cuestiones relacionadas
- 1. Uso de objetos CLOS de Common Lisp como claves en una tabla hash?
- 2. Lisp: ¿Cómo sobrescribir la representación de cadena predeterminada para la clase CLOS?
- 3. ¿Cómo puedo hacer que Perl y Python impriman cada línea del programa que se está ejecutando?
- 4. ¿Cómo hacer que las dependencias de Maven se impriman en un archivo en un formato legible?
- 5. Intentando aprender: ¡Reorientación de objetos y funciones genéricas en LISP!
- 6. ¿Cómo evito que se impriman los datos en stdout en mi valor de retorno?
- 7. Cómo hacer que las cadenas Unicode de Python 2.x no se impriman como u'string '?
- 8. ¿Existe un método genérico para clonar objetos CLOS?
- 9. ¿Cómo hacer que Lisp olvide los símbolos exportados previamente?
- 10. Cómo evitar que un div y su contenido se impriman
- 11. ¿Hay alguna manera de eliminar por completo los campos en awk, para que los delimitadores adicionales no se impriman?
- 12. ¿Puedo hacer esto en Lisp?
- 13. ¿Cómo hacer que Emacs se inicie en `modo de texto` y deshacerse del mensaje LISP?
- 14. ¿Cómo puedo hacer que el constructor de una estructura se evalúe secuencialmente en Common Lisp?
- 15. ¿Cómo hacer referencia al archivo que se está cargando actualmente en Emacs Lisp?
- 16. Cómo hacer ((AB) (CD).) En Lisp
- 17. ¿Cómo hacer que los objetos reaccionen a los toques en Cocos2D?
- 18. ¿Qué significa que "Lisp se puede escribir en sí mismo?"
- 19. Django: objetos que se fusionan
- 20. WPF - Haciendo que los hipervínculos se puedan hacer clic
- 21. Jinja2 ignorar UndefinedErrors para los objetos que no se encuentran
- 22. Comparando Common Lisp con Gambit w.r.t su biblioteca de acceso y sistemas de objetos
- 23. ¿Se puede hacer que los números del teorema se comporten como los números subsubsección en latex?
- 24. ¿CLOS tiene un despacho de especialización eql en cadenas?
- 25. ¿Es posible hacer que los objetos devueltos por una función sean inmutables en C#?
- 26. ¿Cómo hacer que los objetos en el lienzo no sean seleccionables?
- 27. ¿Cómo se inspira Java en Lisp?
- 28. ¿Cómo se serializan los objetos Ember?
- 29. ¿Es factible hacer desarrollo web (serio) en Lisp?
- 30. Asegúrese de que los objetos implementen Comparable
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. –
tal vez tenga razón, pero sirve para mis propósitos, ya que ** debe ** estar ** exactamente ** dos objetos después del { – krzysz00
sí, pero confundirá a todos los editores. s-expresiones deben ser equilibradas. Es un cambio simple de todos modos. –