ama*_*eoh 3 clojure clojure-repl
以下是完全有效的Clojure代码:
(def a (atom nil))
(def b (atom a))
(reset! a b)
Run Code Online (Sandbox Code Playgroud)
它甚至在需要反向引用的情况下很有用.
但是,在REPL中使用这些东西很烦人:只要你输入a或b,REPL就会尝试打印这些引用的内容,当然会很快产生堆栈溢出错误.
那么有什么方法可以控制/改变Clojure中atoms/refs/agents的打印行为?某种类型的循环检测会很好,但即使完全抑制deref的内容也会非常有用.
你可以说
(remove-method print-method clojure.lang.IDeref)
Run Code Online (Sandbox Code Playgroud)
去除可腐蚀物体(原子,参考等)的特殊处理print-method,使它们像这样打印:
user=> (atom 3)
#<Atom clojure.lang.Atom@5a7baa77>
Run Code Online (Sandbox Code Playgroud)
或者,您可以添加更具体的方法来禁止打印某些特定引用类型的内容:
(defmethod print-method clojure.lang.Atom [a ^java.io.Writer w]
(.write w (str "#<" a ">")))
user=> (atom 3)
#<clojure.lang.Atom@4194e059>
Run Code Online (Sandbox Code Playgroud)