2011-09-11 41 views
13

在Common Lisp中,如何覆蓋CLOS類的默認字符串表示形式,以便formatprinc的調用將打印出可理解的內容,即使該類的對象嵌入了其他類型(如列表或數組)中時也是如此?Lisp:如何覆蓋CLOS類的默認字符串表示形式?

例如,如果我在x中包含我的解決方案類的實例時調用(format t "~a~%" x),我希望它打印類似#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>而不是#<SOLUTION {BB7CD31}>

到目前爲止,我設法弄清楚的是編寫自定義函數來處理打印結構,我知道它將包含此類的實例,但這很乏味。當然,Lisp提供了一些免費獲得這個功能的方法嗎?

回答

11

結賬print-object

+0

這是我需要的。作爲一種風格問題,在此方法內打印到傳遞流的「最佳」方式是什麼?我目前使用'format',但調用可能調用此方法的函數似乎很奇怪。 – sadakatsu

+2

'format'不會自己遞歸調用你的方法 - 這是你必須做的事情。此外,許多CL項目都有「打印對象」方法的示例。瀏覽他們以瞭解其他項目通常如何定義它們。 – Xach

15

您應該看到print-objectprint-unreadable-object。假設你有一個名爲FOO像這樣的類:

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

而且要打印情況是這樣的:#<FOO "xyz">其中"xyz"是槽name的內容。在這種情況下,print-object下面的實現會做你想要什麼:

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