4

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

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

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

然而,在 REPL 中处理这样的事情是很烦人的:只要你输入 a 或 b,REPL 就会尝试打印这些引用的内容,当然,很快就会产生堆栈溢出错误。

那么有什么方法可以控制/改变 Clojure 中原子/引用/代理的打印行为吗?某种循环检测会很好,但即使完全抑制取消引用的内容也会非常有用。

4

1 回答 1

9

你可以说

(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>
于 2014-08-21T03:57:43.413 回答