16

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

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

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

4

3 回答 3

18

您应该查看print-objectand print-unreadable-object。假设你有一个FOO这样命名的类:

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

你想打印这样的实例:slot 的内容#<FOO "xyz">在哪里。在这种情况下,以下实现会做你想做的事:"xyz"nameprint-object

(defmethod print-object ((obj foo) out)
  (print-unreadable-object (obj out :type t)
    (format out "~s" (foo-name obj))))
于 2011-09-12T03:20:39.720 回答
13

退房print-object

于 2011-09-12T00:57:53.243 回答
1

如果您还查看22.1.3.13 Printing Other Objects 它建议print-unreadable-object作为这种情况下的通用格式宏

于 2012-07-01T11:17:24.147 回答