为什么Clojure具有承诺交付功能?

时间:2018-08-22 15:56:23

标签: clojure promise

在Clojure中,promise个对象实现了clojure.lang.IFn,并且用单个参数调用promise即可实现promise。这就是实现deliver的方式: [source]

(defn deliver
  "Delivers the supplied value to the promise, releasing any pending
  derefs. A subsequent call to deliver on a promise will have no effect."
  {:added "1.1"
   :static true}
  [promise val] (promise val))

如果(deliver x y)只是对(x y)的间接访问,为什么还要使用deliver

我假设这应该以某种方式帮助消除功能中的诺言-但相同的论点可能适用于使用某些特定于诺言的功能来读取诺言,而不是使用通用的deref函数那个。

2 个答案:

答案 0 :(得分:4)

使这样的代码看起来不错是一种语法糖:

(-> url
    download
    extract-value
    (deliver consumer)

过去,deliver函数具有确保您在第二个调用者处出现异常的行为。它在2011年进行了更改,现在以后的调用将被忽略。

如果作为函数调用,则承诺始终具有相同的行为;如果从交付调用,则函数交付只能填补使某些东西看起来有些不同的工作量。如今,T仍然会使用它与我未来的自我沟通

答案 1 :(得分:1)

deref比函数调用机制通用性低得多。当您看到被取消引用的内容时,您就知道它正在从某个地方获取一些价值。当您看到(f x)时,如果您不知道f是什么,您真的不知道发生了什么:它什么也做不了。 deliver为您提供了更多背景信息。