Serialization 使clos对象可在lisp中打印

Serialization 使clos对象可在lisp中打印,serialization,lisp,common-lisp,clos,Serialization,Lisp,Common Lisp,Clos,如果您想使common lisp中的CLOS对象可打印(以可读的方式打印),那么如何在不使用打印和读取以外的任何东西的情况下执行此操作。至少在我的解决方案中,有两个部分可以完成此操作,但是您需要此功能(感谢cl的工作人员(warn LLGPL) 然后,为了阅读,您需要运行这段代码,它设置了1/2的语法,即{type of object((slot name.slot value)(slot name.slot value)…) 印刷用 (defmethod print-object ((obje

如果您想使common lisp中的CLOS对象可打印(以可读的方式打印),那么如何在不使用打印和读取以外的任何东西的情况下执行此操作。

至少在我的解决方案中,有两个部分可以完成此操作,但是您需要此功能(感谢cl的工作人员(warn LLGPL

然后,为了阅读,您需要运行这段代码,它设置了1/2的语法,即
{type of object((slot name.slot value)(slot name.slot value)…)

印刷用

(defmethod print-object ((object standard-object) stream)
  (format stream "{ ~s ~s}" (type-of object)
      (loop for i in (get-slots object)
    collect (cons i (slot-value object i)))))

当使用所有这些方法时,强烈建议使用
*可读打印*
。此外,请注意,循环关系未经测试

您应该具有平衡的外部表示形式。当前您有一个开头字符,但没有相应的结尾字符。有关阅读,请参阅示例“只读分隔列表”。请参阅中的示例.也许你是对的,但这对我来说很有用,因为在那之后肯定有两个物体{是的,但这会混淆所有编辑器。s表达式应该是平衡的。无论如何,这是一个简单的更改。是的,但是你在Stackoverflow上发布了一个丑陋的黑客,其他人可能会复制它。如果你只保留它在你的软件中,处理它只是你的问题。在Stackoverflow上发布不符合标准的代码不是一个好主意。你的代码根本就不是一个好主意基于S表达式的格式是平衡的,Common Lisp已经给出了一个结构的外部格式示例。使用closer mop更好
(set-macro-character 
     #\{
     #'(lambda (str char)
     (declare (ignore char))
     (let ((list (read-delimited-list #\} str t)))
       (let ((type (first list))
         (list (second list)))
         (let ((class (allocate-instance (find-class type))))
           (loop for i in list do
            (setf (slot-value class (car i)) (cdr i)))
           class)))))
(defmethod print-object ((object standard-object) stream)
  (format stream "{ ~s ~s}" (type-of object)
      (loop for i in (get-slots object)
    collect (cons i (slot-value object i)))))