【问题标题】:Why does Clojure have the promise deliver function?为什么 Clojure 有 Promise Deliver 功能?
【发布时间】:2018-08-23 06:23:49
【问题描述】:

在 Clojure 中,promise 对象实现了clojure.lang.IFn,并且使用单个参数调用承诺实现了承诺。这就是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

我假设这应该以某种方式帮助消除 promise 与函数的歧义——但同样的论点可能适用于使用某些特定于 promise 的函数来读取 promise,而不是使用通用的 deref 函数。

【问题讨论】:

  • 可能允许将来更改实现。
  • 改写@Lee 的评论,deliver 是记录在案的公共 API,直接 fn 调用是实现。

标签: clojure promise


【解决方案1】:

让这样的代码看起来不错是语法糖:

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

deliver 函数过去的行为是确保如果您将第二个调用者放在哪里,就会引发异常。它在 2011 年进行了更改,现在简单地忽略了后来的调用。

如果作为函数调用,Promises 总是具有相同的行为,如果从 Deliver 中调用,则函数 Deliver 只是完成了让有点不同的东西看起来有点不同的工作。这些天T仍然会用它来和我未来的自己交流

【讨论】:

  • 关于额外功能在 2011 年消失的那一点让我明白了这一点。谢谢!
【解决方案2】:

deref 远不如函数调用机制通用。当你看到一些 deref'd 的东西时,你就知道它正在从某个地方获取一些价值。当您看到(f x) 时,如果您还不知道f 是什么,您真的不知道发生了什么:它可以做任何事情。 deliver 为您提供更多背景信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2023-03-28
    • 1970-01-01
    • 2019-03-25
    • 2021-07-24
    • 2013-08-03
    • 2020-09-05
    相关资源
    最近更新 更多