2015-07-08 25 views
7

Sadece belirli mesajları filtreleyen başka bir kanaldan clojure.core.async bir kanal oluşturmak istiyorum. Bu nedenle filtre < adlı bir işlev buldum.Dönüştürücülerden başka bir kanal nasıl oluşturulur?

=> (def c1 (chan)) 
=> (def c2 (filter< even? c1)) 
=> (put! c1 1) 
=> (put! c1 2) 
=> (<!! c2) 
2 

Ama fonksiyonu ve onun arkadaşları kaldırılmış olarak işaretlenir:

kullanımdan kaldırıldı - bu işlev kaldırılacaktır. Kullanım dönüştürücü yerine

xform parametreyle chan gibi dönüştürücü ile kanalları kullanmak için bazı yolları vardır. Dönüştürücüler kullanarak mevcut bir sistemden yeni bir kanal nasıl oluşturabilirim? Bu konuda biraz araştırma yaptım

cevap

6

, ilginç makalelerin bir çift (first ve second) bulundu ve sonra bağlantılı ikinci makale bazı yardımcı olan bu biraz daha temiz hale getirir pipeline

(require '[clojure.core.async :as async :refer [chan <!! pipeline put!]]) 
(def c1 (chan)) 
(def c2 (chan)) 

(pipeline 4 c2 (filter even?) c1) 

(put! c1 1) 
(put! c1 2) 
(<!! c2) 
;;=> 2 

kullanarak çalışan bir şey var

(defn ncpus [] 
    (.availableProcessors (Runtime/getRuntime))) 

(defn parallelism [] 
    (+ (ncpus) 1)) 

(defn add-transducer 
    [in xf] 
    (let [out (chan (buffer 16))] 
    (pipeline (parallelism) out xf in) 
    out)) 

Sonra sadece

birlikte kanallar bağlayabiliriz: boru hattı işlevi etrafında fonksiyonlar 210

(def c1 (chan)) 
(def c2 (add-transducer c1 (filter even?)) 
kendini buldun gibi benzer bir şekilde boru kullanabilirsiniz cevabı tamamlamak için:

(defn pipe-trans 
    [ci xf] 
    (let [co (chan 1 xf)] 
    (pipe ci co) 
    co)) 
(def c1 (chan)) 
(def c2 (pipe-trans c1 (filter even?))) 
+0

ben 'pipe' kullanarak Facory yöntemi yarattı sizin esinlenerek. (-chan [ci xf] 'dan (izin [co (chan 1 xf)] (boru kaynağı) co)) – sschmeck

+0

güzel, memnun olabilirim. –

+1

Diğerlerinin arama yapması durumunda yanıtı denemek ve tamamlamak için fabrika yönteminizin bir sürümünü ekledim. –

İlgili konular