Scala では、Futureの成功した結果に対して関数を実行するためmap
に andを使用できます。flatMap
val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)
これよりも優れたClojure類似物はありますか:
(def x (promise))
(def y (future (str @x)))
の配信を待っている間、上記はスレッドをブロックしませんx
か?
Scala では、Futureの成功した結果に対して関数を実行するためmap
に andを使用できます。flatMap
val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)
これよりも優れたClojure類似物はありますか:
(def x (promise))
(def y (future (str @x)))
の配信を待っている間、上記はスレッドをブロックしませんx
か?
y ie の値を dref しようとするまで、あなたの 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"
スレッド化マクロに似ているが、スレッド化された式ごとにフューチャを作成するマクロを考え出すこともでき->, ->>
ますが、通常の関数を使用してこれを実行できるとしたら、やり過ぎになると思います。