2011-09-11 16 views
13

En Common Lisp, ¿cómo puedo anular la representación de cadena predeterminada de una clase CLOS para que las llamadas a format o princ impriman algo inteligible, incluso cuando los objetos de esa clase están incrustados en otros tipos, como listas o matrices?Lisp: ¿Cómo sobrescribir la representación de cadena predeterminada para la clase CLOS?

Por ejemplo, si llamo a (format t "~a~%" x) cuando x contiene una instancia de mi clase de solución, quiero que imprima algo como #<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6> en lugar de .

Hasta ahora, todo lo que he logrado averiguar es escribir funciones personalizadas para manejar estructuras de impresión que sé que contendrán instancias de esta clase, pero esto es tedioso. ¿Seguramente Lisp proporciona alguna forma de obtener esta funcionalidad gratis?

Respuesta

11

Consulte print-object.

+0

esto era lo que necesitaba. Como pregunta estilística, ¿cuál es la "mejor" forma de imprimir en el flujo pasado dentro de este método? Actualmente estoy usando 'format', pero parece extraño llamar a la función que bien podría estar llamando a este método. – sadakatsu

+2

'format' no llamará a su método recursivamente por sí mismo, eso es algo que tendría que hacer. Además, muchos, muchos proyectos CL tienen ejemplos de métodos 'print-object'. Navegue a través de ellos para ver cómo otros proyectos típicamente los definen. – Xach

15

Debería estar mirando print-object y print-unreadable-object. Suponga que tiene una clase denominada FOO así:

(defclass foo() 
    ((name :accessor foo-name))) 

y que desea imprimir casos como éste: #<FOO "xyz"> donde "xyz" es el contenido de la ranura name. En este caso, la siguiente ejecución de print-object haría lo que quiere:

(defmethod print-object ((obj foo) out) 
    (print-unreadable-object (obj out :type t) 
    (format out "~s" (foo-name obj)))) 
Cuestiones relacionadas