先物でこれを行う方法を説明し、この詳細を隠すものでそれらをラップすることは有用ですが、あなたが最終的な解決策で先物を公開することを望まないことを理解しています。
core> (defn fn1 [input] (java.lang.Thread/sleep 2000) (inc input))
#'core/fn1
core> (defn fn2 [input] (java.lang.Thread/sleep 3000) (* 2 input))
#'core/fn2
core> (time (let [f1 (future (fn1 4)) f2 (future (fn2 4))] @f1 @f2))
"Elapsed time: 3000.791021 msecs"
次に、先物の周りの多くのclojureラッパーのいずれかでそれをラップできます。最も単純なのは、2つの関数を受け取り、それらを並行して実行する関数です。
core> (defn conc [fn1 fn2]
(let [f1 (future (fn1))
f2 (future (fn2))] [@f1 @f2]))
#'core/conc
core> (time (conc #(fn1 4) #(fn2 4)))
"Elapsed time: 3001.197634 msecs"
#
これにより、concが評価する本体の代わりに実行する関数を取得し、呼び出しの前に 置くことによってそれに渡す関数を作成することにより、マクロとして記述する必要がなくなります。
これは、mapとfuture-callを使用して作成することもできます。
core> (map deref (map future-call [#(fn1 4) #(fn2 42)]))
(5 84)
次に、concを次のようになるまでimproceできます(Julien Chastangが賢明に指摘しているように)pmap