clojure - 如何在 Clojure 中链接 Promise

标签 clojure

在 Scala 中,您可以使用 mapflatMap 在 future 的成功结果上运行函数。

val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)

是否有比以下更好的 Clojure 类似物:

(def x (promise))
(def y (future (str @x)))

上面的代码在等待 x 传递时不会阻塞线程吗?

最佳答案

在您尝试 dref y 的值之前,您的 clojure 代码不会阻塞,即

(def x (promise)) ;wont block
(def y (future (str @x)))  ;wont block
(print @y) ;will block

就类比而言,代码看起来不错。但是,如果您想要某种更具声明性的链接 future 的方式(概念上是归约),那么您可以使用 reduce ,如下所示:

(def x (promise))
(def final (reduce #(future (%2 @%1)) 
                   x 
                   [inc dec (partial + 10) str]))

(deliver x 10)
@final => "20"

您甚至可以想出一个类似于线程 ->, ->> 宏的宏,但为每个线程表达式创建 future,但我认为当您可以时,这将是一种矫枉过正使用正常功能执行此操作。

关于clojure - 如何在 Clojure 中链接 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595674/

相关文章:

java - 将 Java 翻译成 Clojure - 添加到列表并返回列表

map - 为什么绑定(bind)会影响我的 map 类型?

clojure - "Can' t 在代码中嵌入对象” Clojure 中 UTF-8 常量的错误

clojure - 在 Clojure 中嵌套宏

clojure - 查询函数在 om.next 中返回值为 nil

clojure - 当谓词为 false 时需要花一段时间来包含最后一项

Clojure rseq 恒定时间?

vector - Clojure:将嵌套向量格式应用于展平向量

clojure - 如何执行超时重试的函数?

java - 如何使 java 库对 clojure 可见?