У меня есть циклический график, который я создал с помощью dosync
и ref-set
. Когда я передаю это println
, я получаю java.lang.StackOverflowError
, как и следовало ожидать, потому что он эффективно пытается напечатать бесконечно вложенную структуру.Как переопределить поведение println для ссылочных типов
Я обнаружил, что если я (str my-ref)
это создает то, что выглядит как [email protected]
и на самом деле не пытается пересечь структуру и печатать все, так что это решает проблему в прямом смысле, а только помогает, когда я очень осторожно о том, что я печатаю на экране. Я хотел бы иметь возможность позвонить (println my-graph)
, чтобы он напечатал ref
как некоторый тип пользовательского текста (возможно, с участием str
), а другой не-ref обычно.
В настоящее время у меня есть специальная функция печати, которая печатает каждый элемент структуры самостоятельно и полностью пропускает печать ref
. (Получается, что смотреть на [email protected]
на самом деле не очень полезно). Это неудобно использовать и мешает значительно выполнять случайную проверку материала на REPL, а также не позволяет инспектору Emacs смотреть на вещи, пока я нахожусь в swank.core/break
debug thingy.
Одна деталь ref
- это фактически значение в defstruct
, которое также содержит некоторые другие материалы, которые я пытаюсь напечатать нормально.
Так что мне интересно, на каком пути я должен идти. Я вижу следующие варианты:
- Выяснить
extend-type
и применять протоколCharSequence
к моейdefstruct
структуре эд так что, когда речь идет черезref
он работает должным образом. Это по-прежнему требует поэтапной проверки структуры и частного случая, когда дело доходит доref
, но по крайней мере оно локализует проблему для структуры, а не для чего-либо, содержащего структуру. - Выясните, как переопределить протокол
CharSequence
, когда он встречается сref
. Это позволяет даже более локализованное поведение и позволяет мне просматривать циклический ref на REPL, даже если он не находится внутри структуры. Это мой предпочтительный вариант. - Выясните, как это сделать с
toString
, который, как мне кажется, называется на некотором уровне, когда я делаюprintln
. Я больше всего не знаю об этом. Довольно невежественны и другие, но я читалJoy of Clojure
, и теперь я все вдохновлен.
Аналогично это решение должно применяться к print
и pprint
и все остальное, что обычно блевать при попытке печати циклического реф. Какую стратегию я должен использовать?
благодарит за любой ввод.
fyi, вывод '' (str my-ref) '' почти наверняка является результатом вызова 'java.lang.Object # toString()' ', как описано здесь: http://docs.oracle. com/javase/7/docs/api/java/lang/Object.html # toString% 28% 29 – sw1nn
Обратите внимание, что 'defstruct' был заменен' defrecord'. Кроме того, 'defstruct' не создает реальный тип, поэтому он не может участвовать в протоколах. – raek
Я понимаю, что на самом деле я уже использовал 'defrecord'. Не знаю, почему мой оригинальный пост сказал 'defstruct'. – Sonicsmooth