2012-08-24 17 views
5

गतिशील चर, binding, और pmap, उदाहरण के लिए मिश्रण करते समय सावधानी बरतने के लिए वहां कुछ हद तक पुरानी ब्लॉग पोस्ट हैं। here, जहां हम निम्नलिखित कोड का टुकड़ा मिल:बाइंडिंग और 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) को पहली पंक्ति को बदलने) नहीं चला है। मुझे आउटपुट के रूप में तीन 15 एस मिलते हैं (क्लोजर 1.4 का उपयोग करके), जैसा कि आप — की अपेक्षा करते हैं, जो फ़ंक्शन द्वारा देखे गए बाध्यकारी रूप में परिवर्तन के साथ pmap को पास किया गया है। क्या थ्रेड-स्थानीय बाइंडिंग और pmap इंटरैक्ट बदल गया है? मुझे यह कहीं भी दस्तावेज नहीं मिल रहा है।

उत्तर

5

1.3 में शुरू स्थानीय बाइंडिंग के सेट को समारोह के साथ pmap पर भेजा जाता है। तो जब तक आप var^को चिह्नित करते हैं: गतिशील यह अब कोई समस्या नहीं है। यह सुविधा बाध्यकारी वाहन कहा जाता है और 1.3 बदलाव का में शामिल है:

से: https://github.com/clojure/clojure/blob/1.3.x/changes.txt

 
Clojure APIs that pass work off to other threads (e.g. send, send-off, pmap, future) now convey the dynamic bindings of the calling thread: 

    (def ^:dynamic *num* 1) 
    (binding [*num* 2] (future (println *num*))) 
    ;; prints "2", not "1" 
+0

धन्यवाद! यह दस्तावेज कहां है? यह http://dev.clojure.org/display/doc/1.3 –

+0

संपादन में शामिल नहीं है संदर्भ –

+0

धन्यवाद! की सराहना की। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^