ホビープロジェクトとして、私はalternate futures and promises implementationに基づいて"From Events to Futures and Promises and back"に取り組んでいます。元の著者はフードの下でチャンネル/イベントを使用しています。そのため私はcore.asyncを使用しています。有効な囲碁構文、型定義とget
機能使用無限ループを処理する方法
func future(func f() (T, bool)) Future <T> {
ch = newChannel()
spawn(func() {
x := f()
for { syncEvt(sndEvt(ch, x)) }
})
return rcvEvt(ch)
}
:今
type Comp struct {
value interface{}
ok bool
}
type Future chan Comp
func future(f func() (interface{}, bool)) Future {
future := make(chan Comp)
go func() {
v, o := f()
c := Comp{v, o}
for {
future <- c
}
}()
return future
}
func (ft Future) get() (interface{}, bool) {
c := <-ft
return c.value, c.ok
}
をClojureのに私はポートこれを、私がいたとき、次のように疑似Go構文で表現未来は、見えます以下のようにそれを実装するために思考:
(defrecord Comp [value ok])
(defn future [f]
(let [future (chan)]
(go-loop [comp (f)]
(>! future comp)
(recur comp))
future))
(defn get [future]
(<!! future))
私はClojureの(とcore.async)にはかなり新しいですので、私は無限go-loop
心配します。 IOCスレッドはこれまでリリースされる予定ですか?私はループを止めるために何らかの毒薬を提供すべきですか(これはかなりエラーが起こりやすいと思いますが)?助言がありますか?
うん、通常 'recur'は[' if'(https://clojuredocs.org/clojure.core/if)を使用して条件付きなる又はその変種の1つ。 –
私は知っていますが、論文からの実装では、無限ループを使用して、将来(チャネルである)、常に 'comp'が利用可能になることを保証します。したがって、私はClojureでこれを処理する方法を知りたいと思います。 – beatngu13