在 Common Lisp 中,如何覆盖 CLOS 类的默认字符串表示,以便调用 format
或 princ
会打印一些可理解的东西,即使该类的对象嵌入到其他类型中,例如列表或数组?
例如,如果我调用 (format t "~a~%" x)
当 x 包含我的解决方案类的实例时,我希望它打印类似 #<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>
的内容而不是 #<SOLUTION {BB7CD31}>
.
到目前为止,我所设法弄清楚的是编写自定义函数来处理我知道将包含此类实例的打印结构,但这很乏味。 Lisp 肯定提供了一些免费获得此功能的方法吗?
最佳答案
您应该查看 print-object
和 print-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))))
关于string - Lisp:如何覆盖 CLOS 类的默认字符串表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382122/