3

我需要一种从 CLOS 对象创建 GraphViz 节点名称的方法,这样每个对象都有自己的节点,如果我更改我的对象并重新创建 GraphViz 可视化,我会为保留的对象获得相同的节点名称(参考) 相同。

如果我只是尝试打印我的对象,我会得到几乎很好的东西(因为我从来没有PRINT-OBJECT为我的班级覆盖):

CL-USER> (format nil "~A" *g*)
"#<GREF {1002D22C81}>"

有没有办法将那1002D22C81部分作为字符串?然后我可以N1002D22C81从中创建 GraphViz 节点名称。

或者我应该(format nil "~A" obj)通过抓住 之间的部分来处理结果作为字符串{}

4

1 回答 1

8

十六进制数是对象地址。它可以在垃圾收集后更改。您的实现可能会提供一个函数来直接获取它,但我认为您不应该使用它。

您可能会考虑做的是向name您的对象添加一个插槽,并使用例如gensym.

如果您想跟踪所有对象,您甚至可以intern将名称放在一个特殊的包中并将它们设置symbol-value为对象(请注意,这将使 GC 无法收集这些对象直到您使用unintern它们的名称,或者取消设置它们symbol-value,或者删除上述特殊包装)。

PS。即使您覆盖,您也可以获得对象地址print-object- 只需传递:identity tprint-unreadable-object.

聚苯乙烯。我相信您知道这(format nil "~A" x)(princ-to-string x).

于 2013-02-13T14:53:28.207 回答