2016-07-30 19 views
1

ホビープロジェクトとして、私は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スレッドはこれまでリリースされる予定ですか?私はループを止めるために何らかの毒薬を提供すべきですか(これはかなりエラーが起こりやすいと思いますが)?助言がありますか?

+0

うん、通常 'recur'は[' if'(https://clojuredocs.org/clojure.core/if)を使用して条件付きなる又はその変種の1つ。 –

+0

私は知っていますが、論文からの実装では、無限ループを使用して、将来(チャネルである)、常に 'comp'が利用可能になることを保証します。したがって、私はClojureでこれを処理する方法を知りたいと思います。 – beatngu13

答えて

4

GoブロックがClojureと同じではありません。 core.async goブロックは、チャネルに接続されたコールバックとして存在し、チャネル自体が存続する限り生き残ります。したがって、goブロックはコールバックよりも構文的な砂糖であると考えてください。

このビデオチュートリアルは、もう少し詳細に入る:https://www.youtube.com/watch?v=VrwVc-saWLw

関連する問題