2024Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解有关如何使用本站的更多信息。

+1
Clojure

使用clojure 1.10.3

user> (def p (promise))
#'user/p
user> (def wrapper
        (reify
          clojure.lang.IDeref
          (deref [_] @p)))
#'user/wrapper
user> wrapper ;; => repl hangs here

在上面的会话中,REPL在最后一个语句上阻塞。我看不出这是为什么。我本来期望@wrapper会阻塞,评估wrapper的值,但我预期它将返回某种类型的Object。我是不是遗漏了什么?

1 答案

+2

选中
 
最佳答案

您的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没有问题,因为上面的第一个函数明确检查了它。

...