clojure - 禁止打印 REPL 中原子保存的数据? (或引用人、代理人……)

标签 clojure clojure-repl

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

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

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

但是,在 REPL 中处理此类内容很烦人:每当您键入 a 或 b 时,REPL 都会尝试打印此类引用的内容,当然,很快就会生成堆栈溢出错误。

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

最佳答案

你可以说

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

print-method 中删除可取消引用对象(Atom、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>

关于clojure - 禁止打印 REPL 中原子保存的数据? (或引用人、代理人……),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417958/

相关文章:

clojure - 如何在intellij idea中增加REPL字体大小...?

clojure - 如何重复 Clojure REPL 中的最后一行?

recursion - 如何理解clojure的lazy-seq

clojure - 在 Clojure 中代理命名参数的惯用方法

clojure - 在Clojure中,如何对元素进行分组?

concurrency - Clojure:并行计算产生的数据访问速度似乎要慢得多

JQuery 的 Promise() 和 ClojureScript

clojure - 最好的 Clojure 复制品?