5

binding動的変数、、、およびを混合する際の注意をアドバイスする、やや古いブログ投稿がいくつかありますpmap。たとえば、ここでは、次のコードスニペットを取得します。

user=> (def *foo* 5)
#'user/*foo*
user=> (defn adder
             [param]
             (+ *foo* param))
#'user/adder
user=> (binding [*foo* 10]
         (doseq [v (pmap adder (repeat 3 5))]
           (println v)))
10
10
10
nil

しかし、それは私がそのコードを実行したときに起こることではありません(最初の行をに変更します(def ^:dynamic *foo* 5))。単純に予想されるように、(Clojure 1.4を使用して)出力として3つのsを取得15します。つまり、pmapに渡された関数によって見られるバインディング形式の変更があります。スレッドローカルバインディングとpmapの相互作用の方法は変更されましたか?この文書はどこにも見つかりません。

4

1 に答える 1

5

1.3以降、ローカルバインディングのセットが関数とともにpmapに送信されます。var ^:dynamicをマークする限り、これはもはや問題ではありません。この機能はBindingConveyanceと呼ばれ、1.3の変更ログに含まれています。

差出人:https ://github.com/clojure/clojure/blob/1.3.x/changes.txt

他のスレッド(send、send-off、pmap、futureなど)に作業を渡すClojure APIは、呼び出し元のスレッドの動的バインディングを伝達するようになりました。

  (def ^:dynamic * num * 1)
  (バインディング[* num * 2](future(println * num *)))
  ;; 「1」ではなく「2」を出力します
于 2012-08-24T21:36:59.080 に答える