【问题标题】:Error in Code Example: "Can only recur from tail position"代码示例中的错误:“只能从尾部位置重复出现”
【发布时间】:2016-12-13 08:20:42
【问题描述】:

以下函数使用通道实现映射功能,类似于普通clojure map的行为

我从 Paul Butcher 的七周内的七个并发模型一书中得到了这个代码示例。似乎这段代码已经过时了,因为在执行它时,它会抛出以下错误消息。有谁知道如何修复这个功能?

错误信息:

只能从尾部位置递归 {: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)
         )
 )

【问题讨论】:

    标签: clojure channels


    【解决方案1】:

    确实不行; errata to the book中也提到了这一点。

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

    (defn map-chan [f from]
      (let [to (chan)]
        (go (loop []
              (when-let [x (<! from)]
                (>! to (f x))
                (recur)))
            (close! to))
        to))
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多