首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清理地图上的通道

清理地图上的通道
EN

Stack Overflow用户
提问于 2016-03-10 04:38:18
回答 2查看 134关注 0票数 4

假设我们有一个具有以下结构的映射m

代码语言:javascript
复制
{:a (go "a") 
  :b "b" 
  :c "c" 
  :d (go "d")}

如图所示,m有四个键,其中两个包含通道。

问题:如何编写一个通用函数(或宏?) cleanse-map,它接受像m这样的映射并输出它的无通道版本(在这种情况下,它将是{:a "a" :b "b" :c "c" :d "d"})?

对于这个问题,一个很好的帮助函数可能如下:

代码语言:javascript
复制
(defn chan? [c]
  (= (type (chan)) (type c)))

cleanse-map的返回值(或它称为什么)本身是否是一个通道也不重要。即:

代码语言:javascript
复制
`(cleanse-map m) ;=> (go {:a "a" :b "b" :c "c" :d "d"})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-10 05:20:37

局限性 of core.async使cleanse-map的实现不那么简单。但以下一项应能发挥作用:

代码语言:javascript
复制
(defn cleanse-map [m]
  (let [entry-chs (map
                   (fn [[k v]]
                     (a/go
                       (if (chan? v)
                         [k (a/<! v)]
                         [k v])))
                   m)]
    (a/into {} (a/merge entry-chs))))

基本上,这里所做的是:

  1. 每个地图条目被转换成一个通道,该通道将包含此映射条目。如果映射项的值是一个通道,则在映射函数的go-block中提取它。
  2. 带有地图条目的通道是merge-d到单个的.在这一步之后,您将拥有一个包含地图条目集合的通道。
  3. 带有映射项的通道被转换为包含所需映射的通道(a/into步骤)。
票数 3
EN

Stack Overflow用户

发布于 2016-03-10 05:30:29

代码语言:javascript
复制
(ns foo.bar
  (:require
    [clojure.core.async :refer [go go-loop <!]]
    [clojure.core.async.impl.protocols :as p]))

(def m
  {:a (go "a")
   :b "b"
   :c "c"
   :d (go "d")
   :e "e"
   :f "f"
   :g "g"
   :h "h"
   :i "i"
   :j "j"
   :k "k"
   :l "l"
   :m "m"})

(defn readable? [x]
  (satisfies? p/ReadPort x))

(defn cleanse-map
  "Takes from each channel value in m,
   returns a single channel which will supply the fully realized m."
  [m]
  (go-loop [acc {}
            [[k v :as kv] & remaining] (seq m)]
    (if kv
      (recur (assoc acc k (if (readable? v) (<! v) v)) remaining)
      acc)))

(go (prn "***" (<! (cleanse-map m))))

=>“*”{:m "m",e "e",:l "l",K "k",:g "g",:c "c",J "j",:h "h",:b "b",d "d",:f "f",:i "i",a "a"}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35907709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档