2011-09-11 8 views
13

W Common Lisp, w jaki sposób mogę przesłonić domyślną reprezentację ciągów klasy CLOS, aby wywołania do format lub princ mogły drukować coś zrozumiałego, nawet jeśli obiekty tej klasy są osadzone w innych typach, takich jak listy lub tablice?Lisp: Jak zastąpić domyślną reprezentację ciągów dla klasy CLOS?

Na przykład, jeśli zadzwonię pod numer (format t "~a~%" x), gdy x ma instancję klasy mojego rozwiązania, chcę, aby wydrukował coś w rodzaju #<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6> zamiast #<SOLUTION {BB7CD31}>.

Do tej pory wszystko, co udało mi się wymyślić, to pisanie niestandardowych funkcji do obsługi struktur drukowania, które, jak wiem, będą zawierać wystąpienia tej klasy, ale jest to uciążliwe. Z pewnością Lisp zapewnia jakiś sposób na uzyskanie tej funkcjonalności za darmo?

Odpowiedz

11

Sprawdź print-object.

+0

To było to, czego potrzebowałem. Jako stylistyczne pytanie, jaki jest "najlepszy" sposób drukowania do przekazanego strumienia wewnątrz tej metody? Obecnie używam 'formatu', ale wydaje się dziwne wywoływać funkcję, która może równie dobrze wywoływać tę metodę. – sadakatsu

+2

'format' nie wywoła rekursywnie twojej metody - jest to coś, co musiałbyś zrobić. Również wiele, wiele projektów CL ma przykłady metod 'print-object'. Przejrzyj je, aby zobaczyć, jak zwykle definiują je inne projekty. – Xach

15

Powinieneś zobaczyć print-object i print-unreadable-object. Załóżmy, że masz klasę o nazwie FOO tak:

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

I chcesz wydrukować instancje tak: #<FOO "xyz"> gdzie "xyz" jest treść gniazda name. W tym przypadku, po wdrożenie print-object by robić to, co chcesz:

(defmethod print-object ((obj foo) out) 
    (print-unreadable-object (obj out :type t) 
    (format out "~s" (foo-name obj)))) 
Powiązane problemy