代码示例中的错误:“只能从尾部位置重现”

时间:2016-12-13 08:20:42

标签: clojure channels

以下函数使用通道实现映射功能,类似于普通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)
         )
 )

1 个答案:

答案 0 :(得分:1)

确实,它不起作用;这也在errata to the book中提到。

您可以将close!函数调用放在循环之外,以确保recur处于最终位置(请注意,您必须使用goloop而不是{ {1}}为此):

go-loop