抑制REPL中原子保存的数据的打印? (或参考,代理人......)

时间:2014-08-21 03:51:28

标签: clojure clojure-repl

以下是完全有效的Clojure代码:

(def a (atom nil))
(def b (atom a))
(reset! a b)

它甚至在需要反向引用的情况下也很有用。

然而,在REPL中使用这些东西很烦人:只要你输入a或b,REPL就会尝试打印这些引用的内容,当然会很快产生堆栈溢出错误。 / p>

那么在Clojure中有没有办法控制/改变atoms / refs / agents的打印行为?某种类型的循环检测会很好,但即使完全抑制deref的内容也会非常有用。

1 个答案:

答案 0 :(得分:9)

你可以说

(remove-method print-method clojure.lang.IDeref)

print-method删除对可镜像对象(Atoms,Refs等)的特殊处理,使其打印如下:

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>