您的REPL试图以一种有意义的方式来打印 wrapper,这包括在对其进行 deref 后获取的值。
(defn- deref-as-map [^clojure.lang.IDeref o]
(let [pending (and (instance? clojure.lang.IPending o)
(not (.isRealized ^clojure.lang.IPending o)))
[ex val]
(when-not pending
(try [false (deref o)]
(catch Throwable e
[true e])))]
{:status
(cond
(or ex
(and (instance? clojure.lang.Agent o)
(agent-error o)))
:failed
pending
:pending
:else
:ready)
:val val}))
(defmethod print-method clojure.lang.IDeref [o ^Writer w]
(print-tagged-object o (deref-as-map o) w))
请注意,打印出 promise 正常工作,因为上面的第一个函数明确检查了它的值。