Подавить печать данных, которые атом держит в 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>
Другие вопросы по тегам