我有一个使用dosyncand创建的循环图ref-set。当我将它传递给我时,println我得到了java.lang.StackOverflowError我所期望的 a,因为它实际上是在尝试打印一个无限嵌套的结构。
我发现,如果我这样做(str my-ref),它会创建一些看起来像vertex@23f7d873但实际上并没有尝试遍历结构并将所有内容打印出来的东西,所以这从直接意义上解决了问题,但只有当我非常小心我的内容时才有帮助m 打印到屏幕上。我希望能够调用(println my-graph)让它打印ref为某种类型的自定义文本(可能涉及str),以及其他非参考的东西。
目前我有一个自定义打印功能,它自己打印结构的每个元素并完全跳过打印ref. (事实证明,看vertex@23f7d873实际上并不是很有用)。这使用起来很尴尬,并且极大地阻碍了在 REPL 中对内容进行随意检查,并且还阻止了 Emacs 检查员在我处于swank.core/break调试状态时查看内容。
一个细节是ref实际上是 a 中的一个值defstruct,它还包含我试图正常打印的一些其他内容。
所以我想知道我应该走哪条路。我看到这些选项:
- 找出协议
extend-type并将其应用于CharSequencemydefstructed 结构,以便在遇到 a 时ref它可以正常工作。这仍然需要对结构进行逐个字段的检查,并在涉及到 时需要特殊情况ref,但至少它将问题定位到结构而不是包含该结构的任何东西。 - 找出
CharSequence在遇到ref. 这允许更本地化的行为,并允许我在 REPL 上查看循环引用,即使它不在结构内。这是我的首选。 - 弄清楚如何做一些
toString我认为在我做的时候在某种程度上被调用的事情println。我对这个选项最无知。对其他的也很无知,但我一直在阅读Joy of Clojure,现在我都受到了启发。
同样,此解决方案应适用于print和pprint其他任何在尝试打印循环引用时通常会出错的东西。我应该采用什么策略?
非常感谢您的任何意见。