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

sad*_*tsu 14 lisp string common-lisp representation clos

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

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

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

Eli*_*son 17

你应该看着print-objectprint-unreadable-object.假设你有一个FOO如此命名的类:

(defclass foo ()
  ((name :accessor foo-name)))
Run Code Online (Sandbox Code Playgroud)

并且您想要打印这样的实例:插槽的内容#<FOO "xyz">在哪里.在这种情况下,以下实现会做你想要的:"xyz"nameprint-object

(defmethod print-object ((obj foo) out)
  (print-unreadable-object (obj out :type t)
    (format out "~s" (foo-name obj))))
Run Code Online (Sandbox Code Playgroud)


Ros*_*ews 11

退房print-object.

  • `format`不会自己递归地调用你的方法 - 这是你必须要做的事情.此外,许多CL项目都有"print-object"方法的例子.浏览它们以查看其他项目通常如何定义它们. (2认同)