【问题标题】:Lisp: How to override default string representation for CLOS class?Lisp:如何覆盖 CLOS 类的默认字符串表示?
【发布时间】:2011-11-14 23:27:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: string lisp common-lisp representation clos


    【解决方案1】:

    您应该查看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))))
    

    【讨论】:

      【解决方案2】:

      查看print-object

      【讨论】:

      • 这正是我所需要的。作为一个风格问题,在此方法中打印到传递的流的“最佳”方式是什么?我目前正在使用format,但是调用很可能正在调用此方法的函数似乎很奇怪。
      • format 不会自行递归调用您的方法 - 这是您必须做的事情。此外,很多很多 CL 项目都有 print-object 方法的示例。浏览它们以了解其他项目通常如何定义它们。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-09
        • 2019-03-12
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        相关资源
        最近更新 更多