以下函数使用通道实现映射功能,类似于普通clojure的行为map
我从Paul Butcher的七周内 Seven并发模型一书中得到了这个代码示例。似乎这段代码已经过时了,因为在执行它时,它会抛出以下错误消息。有谁知道如何修复这个功能?
错误消息:
只能从尾部位置{:exprs nil,:form(recur)
重现
代码:
(defn map-chan [f from]
(let [to (chan)]
(go-loop []
(when-let [x (<! from)]
(>! to (f x))
(recur))
(close! to))
to))
我的第一次修复尝试: //与原点相同的错误
(defn map-chan [f from]
(go-loop []
(do
(let [to (chan)]
(when-let [x (<! from)]
(>! to (f x))
(recur))))
(close! to)
)
)
答案 0 :(得分:1)
确实,它不起作用;这也在errata to the book中提到。
您可以将close!
函数调用放在循环之外,以确保recur
处于最终位置(请注意,您必须使用go
和loop
而不是{ {1}}为此):
go-loop