2017-03-05 3 views
2

du den folgenden Schnipsel:‚Wiederholt‘ in Core.Async

(require '[clojure.core.async :refer :all]) 


(def my-chan (chan (buffer 10))) 

(go (while true 
     (>! my-chan (rand)))) 

Dies stellt im Prinzip einen gepufferten Kanal, der immer einig 10 Zufallszahl enthält. Wenn der Kanal verbraucht ist, wird der Puffer erneut gefüllt.

Gibt es dafür eine Abstraktion in core.async?

Für Sequenzen, die man für so etwas gehen würde: Da es Wandler zur Manipulation des Verbrauchs von Kanälen sind, könnte es auch etwas für die Herstellung von ihnen

(def my-seq 
    (map (fn [_] (rand)) (range))) 

oder nur:

(def my-seq (repeatedly rand)) 

Was natürlich nicht gepuffert ist, aber es könnte eine Vorstellung davon geben, wonach ich suche.

+0

Ich bin mir nicht sicher, was Sie hier suchen .....? –

Antwort

0

Transducer manipulieren nicht den Verbrauch von Kanälen - sie beeinflussen die Werte, aber sie beeinflussen nicht den Verbrauch der Daten auf dem Kanal.

Sie scheinen nach einer Möglichkeit zu fragen, die Erstellung eines Kanals zu abstrahieren und dann Werte daraus als Sequenz zu erhalten. Hier sind einige Ideen, obwohl ich nicht überzeugt bin, dass core.async in diesem Fall wirklich etwas über der normalen clojure.core-Funktionalität bietet.

Abstraktion wird hier so gemacht, wie es normalerweise gemacht wird - mit Funktionen. Dies ruft f auf und setzt sein Ergebnis auf den Kanal. Die Implikation hier ist natürlich, dass f seiteneffektiv und unrein ist, sonst wäre es ein ziemlich langweiliger Kanal, von dem jeder konsumieren würde, wobei jeder Wert identisch ist.

(defn chan-factory 
    [f buf] 
    (let [c (chan buf)] 
    (go-loop [] 
     (>! c (f)) 
     (recur)) 
    c)) 

Wenn Sie dann eine faule Sequenz von diesem schaffen wollen, könnten Sie tun:

(defn chan-to-seq [c] 
    (lazy-seq 
    (cons (<!! c) (chan-to-seq c)))) 

Definieren Sie Ihre seq:

(def rand-from-chan (chan-to-seq (chan-factory rand 10))) 

(take 5 rand-from-chan) 
=> 
(0.6873518531956767 
0.6940302424998631 
0.07293052906941855 
0.7264083273536271 
0.4670275072317531) 

Sie können jedoch dieses Gleiche erreichen durch tun:

(def rand-nums (repeatedly rand)) 

Während das, was Sie tun, ein großartiges Gedankenexperiment ist, könnte es hilfreicher sein, einige konkrete Anwendungsfälle zu finden, und dann erhalten Sie möglicherweise spezifischere Ideen. Viel Glück!

Verwandte Themen