我正在从《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/消息
“执行错误(IllegalArgumentException)在 user/eval140$fn(form-init12172038470509011992.clj:1)。\n不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel\n 创建 ISeq”,
:clojure.main/分类
{:clojure.error/class java.lang.IllegalArgumentException,
:clojure.error/第 1 行
:clojure.error/原因
“不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel 创建 ISeq”,
:clojure.error/符号用户/eval140$fn,
:clojure.error/source“form-init12172038470509011992.clj”,
:clojure.error/phase:执行},
:clojure.main/trace
{:通过
[{:type clojure.lang.Compiler$CompilerException,
:message "Syntax error macroexpanding at (xforms.clj:10:8).", :data
{:clojure.error/phase:执行,
:clojure.error/第 10 行,
:clojure.error/第 8 列,
:clojure.error/source "xforms.clj"},
:在[clojure.lang.Compiler$InvokeExpr eval“Compiler.java”3719]}
{:类型 java.lang.IllegalArgumentException,
:信息
“不知道如何从 clojure.core.async.impl.channels.ManyToManyChannel 创建 ISeq”,
:在 [clojure.lang.RT seqFrom "RT.java" 557]}],
clojure 版本是 - 1.12.0 和 clojure.core.async - 1.6.681
我该如何修复这个错误?
您使用的
clojure.core/into
是 的最后一步transformed
。它适用于序列,而不是core.async
通道。因此您需要将其切换到异步变体。一般来说,对于异步操作,我建议采用一种清晰的风格,并且不要使用
:refer
太多。