以下是完全有效的 Clojure 代码:
(def a (atom nil))
(def b (atom a))
(reset! a b)
它甚至在需要反向引用的情况下也很有用。
然而,在 REPL 中处理这样的事情是很烦人的:只要你输入 a 或 b,REPL 就会尝试打印这些引用的内容,当然,很快就会产生堆栈溢出错误。
那么有什么方法可以控制/改变 Clojure 中原子/引用/代理的打印行为吗?某种循环检测会很好,但即使完全抑制取消引用的内容也会非常有用。
以下是完全有效的 Clojure 代码:
(def a (atom nil))
(def b (atom a))
(reset! a b)
它甚至在需要反向引用的情况下也很有用。
然而,在 REPL 中处理这样的事情是很烦人的:只要你输入 a 或 b,REPL 就会尝试打印这些引用的内容,当然,很快就会产生堆栈溢出错误。
那么有什么方法可以控制/改变 Clojure 中原子/引用/代理的打印行为吗?某种循环检测会很好,但即使完全抑制取消引用的内容也会非常有用。
你可以说
(remove-method print-method clojure.lang.IDeref)
删除对 derefable 对象(Atoms、Refs 等)的特殊处理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>