在将转换器与 async.channel 一起使用时,“不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel 创建 ISeq”

问题描述 投票:0回答:1

我正在从“clojure中的反应式编程”学习core.async

其中一个示例程序如下 -


(ns core-async-intro.xforms
  (:require [clojure.core.async :refer [map< filter< chan go <! >! close!]]))

(def result (chan 10))

(def transformed
  (->> result
       (map< inc) ;; creates a new channel
       (filter< even?) ;; creates a new channel
       (into [])))

(defn -main [& args]
  (go
    (prn "result is " (<! transformed)))

  (go
    (doseq [n (range 10)]
      (>! result n))
    (close! result)))

但是当我运行这个程序时,我收到以下错误 -

{:clojure.main/消息

“user/eval140$fn (form-init12172038470509011992.clj:1) 处执行错误 (IllegalArgumentException)。 不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel 创建 ISeq ”,

:clojure.main/分类

{:clojure.error/class java.lang.IllegalArgumentException,

:clojure.error/第 1 行

:clojure.错误/原因

“不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel 创建 ISeq”,

:clojure.error/符号用户/eval140$fn,

:clojure.error /源“form-init12172038470509011992.clj”,

:clojure.error/阶段:执行},

:clojure.main/trace

{:通过

[{:类型 clojure.lang.Compiler$CompilerException,

:message "Syntax error macroexpanding at (xforms.clj:10:8).",
 
:data
 

{:clojure.error/阶段:执行,

:clojure.error/第 10 行,

:clojure.error/第 8 列,

:clojure.error/源“xforms.clj”},

:在[clojure.lang.Compiler$InvokeExpr eval“Compiler.java”3719]}

{:类型 java.lang.IllegalArgumentException,

:留言

“不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel 创建 ISeq”,

:at [clojure.lang.RT seqFrom "RT.java" 557]}],

clojure 版本是 - 1.12.0 和 clojure.core.async - 1.6.681

如何修复此错误?

clojure transducer
1个回答
0
投票

您正在使用

clojure.core/into
作为
transformed
的最后一步。这适用于序列,而不是
core.async
通道。因此,您需要将其切换为异步变体。

一般来说,对于异步操作,我会推荐一种明确的风格,并且不要过多使用

:refer

(ns core-async-intro.xforms
  (:require [clojure.core.async :as async :refer [go <! >!]]))

(def result (async/chan 10))

(def transformed
  (->> result
       (async/map< inc) ;; creates a new channel
       (async/filter< even?) ;; creates a new channel
       (async/into [])))

(defn -main [& args]
  (go
    (prn "result is " (<! transformed)))

  (go
    (doseq [n (range 10)]
      (>! result n))
    (async/close! result)))
© www.soinside.com 2019 - 2024. All rights reserved.