2011-09-11 29 views
13

Trong Lisp thông thường, làm thế nào tôi có thể ghi đè biểu diễn chuỗi mặc định của một lớp CLOS để các cuộc gọi đến format hoặc princ sẽ in một cái gì đó dễ hiểu, ngay cả khi đối tượng của lớp đó được nhúng trong các loại khác, chẳng hạn như danh sách hoặc mảng?Lisp: Cách ghi đè biểu diễn chuỗi mặc định cho lớp CLOS?

Ví dụ, nếu tôi gọi (format t "~a~%" x) khi x giữ một thể hiện của lớp giải pháp của tôi, tôi muốn nó in một cái gì đó như #<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6> thay vì #<SOLUTION {BB7CD31}>. Cho đến nay, tất cả những gì tôi đã tìm ra là viết các hàm tùy chỉnh để xử lý các cấu trúc in mà tôi biết sẽ chứa các cá thể của lớp này, nhưng điều này thật tẻ nhạt. Chắc chắn Lisp cung cấp một số cách để có được chức năng này miễn phí?

Trả lời

11

Khám phá print-object.

+0

Đây là những gì tôi cần. Như một câu hỏi phong cách, cách "tốt nhất" để in ra luồng được truyền bên trong phương thức này là gì? Tôi hiện đang sử dụng 'định dạng', nhưng có vẻ lạ khi gọi hàm này rất có thể đang gọi phương thức này. – sadakatsu

+2

'định dạng' sẽ không tự gọi phương thức của bạn một cách đệ quy - đó là điều bạn phải làm. Ngoài ra, nhiều, nhiều dự án CL có các ví dụ về các phương thức 'đối tượng in '. Duyệt qua chúng để xem các dự án khác thường xác định chúng như thế nào. – Xach

15

Bạn nên xem print-objectprint-unreadable-object. Giả sử bạn có một lớp có tên FOO như vậy:

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

Và bạn muốn in trường hợp như thế này: #<FOO "xyz"> nơi "xyz" là nội dung của khe name. Trong trường hợp này, việc thực hiện sau đây của print-object sẽ làm những gì bạn muốn:

(defmethod print-object ((obj foo) out) 
    (print-unreadable-object (obj out :type t) 
    (format out "~s" (foo-name obj)))) 
Các vấn đề liên quan