Lisp:如何覆盖CLOS类的默认字符串表示?

时间:2011-09-11 23:52:30

标签: string lisp common-lisp representation clos

在Common Lisp中,如何覆盖CLOS类的默认字符串表示形式,以便对formatprinc的调用将打印出可理解的内容,即使该类的对象嵌入在其他类型中也是如此,例如列表或数组?

例如,如果我在x持有我的解决方案类的实例时调用(format t "~a~%" x),我希望它打印类似#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>而不是#<SOLUTION {BB7CD31}>的内容。

到目前为止,我已经设法弄清楚是编写自定义函数来处理我知道将包含此类实例的打印结构,但这很乏味。当然Lisp提供了一些免费获得此功能的方法吗?

3 个答案:

答案 0 :(得分:17)

您应该关注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))))

答案 1 :(得分:11)

查看print-object

答案 2 :(得分:1)

如果您还看22.1.3.13 Printing Other Objects,则建议将print-unreadable-object作为此类情况的通用格式宏