Подавить печать данных, которые атом держит в REPL? (или ссылка, агент, ...)
Ниже приведен совершенно корректный код Clojure:
(def a (atom nil))
(def b (atom a))
(reset! a b)
это даже полезно в ситуациях, когда необходимы обратные ссылки.
Однако работать с такими вещами в REPL раздражает: REPL будет пытаться печатать содержимое таких ссылок всякий раз, когда вы набираете a или b, и, конечно, довольно быстро генерирует ошибку переполнения стека.
Так есть ли способ контролировать / изменять поведение печати атомов / ссылок / агентов в Clojure? Было бы неплохо обнаружить цикл, но даже полное подавление разыменованного контента было бы действительно полезно.
1 ответ
Ты можешь сказать
(remove-method print-method clojure.lang.IDeref)
удалить специальную обработку разыскиваемых объектов (атомы, ссылки и т. д.) из print-method
в результате чего они будут напечатаны так:
user=> (atom 3)
#<Atom clojure.lang.Atom@5a7baa77>
В качестве альтернативы, вы можете добавить более конкретный метод для подавления печати содержимого определенного ссылочного типа:
(defmethod print-method clojure.lang.Atom [a ^java.io.Writer w]
(.write w (str "#<" a ">")))
user=> (atom 3)
#<clojure.lang.Atom@4194e059>