我正在从书“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.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)))