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?
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
'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