sad*_*tsu 14 lisp string common-lisp representation clos
在Common Lisp中,如何覆盖CLOS类的默认字符串表示形式,以便调用format或princ打印可理解的内容,即使该类的对象嵌入其他类型(如列表或数组)中也是如此?
例如,如果我(format t "~a~%" x)在x持有我的解决方案类的实例时调用,我希望它打印出类似的东西#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>而不是#<SOLUTION {BB7CD31}>.
到目前为止,我已经设法弄清楚是编写自定义函数来处理我知道将包含此类实例的打印结构,但这很乏味.当然Lisp提供了一些免费获得此功能的方法吗?
Eli*_*son 17
你应该看着print-object和print-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.