我有一个使用dosync
and创建的循环图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
并将其应用于CharSequence
mydefstruct
ed 结构,以便在遇到 a 时ref
它可以正常工作。这仍然需要对结构进行逐个字段的检查,并在涉及到 时需要特殊情况ref
,但至少它将问题定位到结构而不是包含该结构的任何东西。 - 找出
CharSequence
在遇到ref
. 这允许更本地化的行为,并允许我在 REPL 上查看循环引用,即使它不在结构内。这是我的首选。 - 弄清楚如何做一些
toString
我认为在我做的时候在某种程度上被调用的事情println
。我对这个选项最无知。对其他的也很无知,但我一直在阅读Joy of Clojure
,现在我都受到了启发。
同样,此解决方案应适用于print
和pprint
其他任何在尝试打印循环引用时通常会出错的东西。我应该采用什么策略?
非常感谢您的任何意见。