2016-12-13 12 views
1

follwing機能は、私は本七つの同時実行モデルから、このコード例を持って、通常のClojure mapエラー:「唯一の末尾位置から再発することがある」

のbehavoiurに類似のチャネルを、使用してマッピング機能を実装7週間で Paul Butcher著このコードは、実行時に以下のエラーメッセージがスローされるため、すでに古くなっているようです。誰もその機能を修正する方法を知っていますか?

エラーメッセージ:は、exprはnil、::フォーム(再発)

コード:

(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

実際、動作しません。これはerrata to the bookでも言及されています。

あなたは(あなたが代わりにそのためのgo-loopgoloopを使用する必要があることに注意してください)recurが最終位置にあることを保証するために、ループの外close!関数呼び出しを置くことができます。

(defn map-chan [f from] 
    (let [to (chan)] 
    (go (loop [] 
      (when-let [x (<! from)] 
      (>! to (f x)) 
      (recur))) 
     (close! to)) 
    to)) 
関連する問題