У меня есть циклический граф, который я создал с помощью dosync
и набор ссылок
. Когда я передаю это в println
, я получаю java.lang.StackOverflowError
, как и ожидал, потому что он эффективно пытается напечатать бесконечно вложенную структуру.
Я обнаружил, что если я делаю (str my-ref)
, создается что-то похожее на vertex@23f7d873
и на самом деле не пытается пройти через структуру и распечатать все , так что это решает проблему в прямом смысле, но помогает только тогда, когда я очень внимательно отношусь к тому, что я печатаю на экране. Я хотел бы иметь возможность вызывать (println my-graph)
, чтобы он печатал ref
как некоторый тип пользовательского текста (возможно, с участием str
), и другие вещи, не связанные с рефери, обычно.
В настоящее время у меня есть пользовательская функция печати, которая печатает каждый элемент структуры отдельно и полностью пропускает печать ref
. (Оказывается, смотреть на vertex@23f7d873
на самом деле не очень полезно). Это неудобно в использовании и сильно мешает выполнять случайную проверку материала в REPL, а также не позволяет инспектору Emacs просматривать материал, пока я нахожусь в swank.core/break
отладочной штуке.
Одна деталь заключается в том, что ref
на самом деле является значением в defstruct
, которое также содержит некоторые другие данные, которые я пытаюсь напечатать в обычном режиме.
Вот я и думаю, по какому пути мне идти. Я вижу следующие варианты:
extend-type
и примените протокол CharSequence
к моей структуре defstruct
ed, чтобы при встрече с ref
работает правильно. Это по-прежнему требует полевой проверки структуры и особого случая, когда речь идет о ref
, но, по крайней мере, это локализует проблему в структуре, а не во всем, что содержит структуру.CharSequence
, когда он встречает ref
. Это обеспечивает еще более локализованное поведение и позволяет мне просматривать циклическую ссылку в REPL, даже если она не находится внутри структуры. Это мой предпочтительный вариант.toString
, который, как мне кажется, вызывается на каком-то уровне, когда я делаю println
. Я самый невежественный об этом варианте.О других я тоже ничего не знаю, но я читал Joy of Clojure
, и теперь я полностью вдохновлен.Подобным образом это решение должно применяться к print
и pprint
и ко всему остальному, что обычно выдает ошибку при попытке напечатать циклическую ссылку. Какую стратегию мне следует использовать?
Большое спасибо за любой вклад.