2017-03-05 7 views
2

에서는 다음 코드를 고려'반복'Core.Async

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


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

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

이 기본적으로 항상 약 10 임의의 숫자를 포함하는 버퍼 채널을 제공합니다. 채널이 사용되면 버퍼가 다시 채워집니다.

core.async에서 이에 대한 추상화가 있습니까? 단지

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

또는 :

시퀀스 하나 같이 뭔가를 갈 것 : 채널의 소비를 조작 트랜스 듀서가있을 때,뿐만 아니라 그들의 생산을위한 뭔가가있을 수 있습니다

(def my-seq (repeatedly rand)) 

당연히 버퍼링되지 않지만 어느 것이 내가 원하는 것인지 알 수 있습니다.

+0

나는 당신이 여기에서 찾고있는 것을 정말로 모르겠다. .....? –

답변

0

트랜스 듀서는 채널 소비를 조작하지 않습니다 - 값에 영향을 미치지 만 채널의 데이터 소비에는 영향을 미치지 않습니다.

채널 생성을 추상화 한 다음 시퀀스로 값을 가져 오는 방법을 묻는 것처럼 보입니다. core.async가 실제로이 경우 일반적인 clojure.core 기능보다 뛰어난 것을 제공한다고 확신하지는 않지만 몇 가지 아이디어가 있습니다.

추상화는 여기에서 일반적으로 수행되는 방식으로 수행됩니다. 그러면 f이 호출되어 결과가 채널에 저장됩니다. 여기서 암시하는 바는 물론 f이 부작용이고 불순한 것입니다. 그렇지 않으면 모든 값이 동일하게 유지되는 상당히 지루한 채널이됩니다. 당신이 다음이에서 게으른 시퀀스를 만들고 싶었 경우

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

, 당신은 할 수 :

(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) 

그러나하여이 같은 일을 수행 할 수 있습니다

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

당신의 서열을 정의 하고 :

(def rand-nums (repeatedly rand)) 

당신이하고있는 일이 좋은 생각의 실험이지만, 구체적인 사용 사례를 찾는 것이 더 도움이 될 수 있습니다. 그러면 더 구체적인 아이디어를 얻을 수 있습니다. 행운을 빕니다!