2016-09-03 6 views
9

This Clojure code एकीकृत अद्यतन मॉडल को संदर्भित करता है।एकीकृत अद्यतन मॉडल क्या है? गिटहब पर

क्या आप समझा सकते हैं कि fixing फ़ंक्शन एकीकृत अद्यतन मॉडल के साथ कैसे काम करता है?

(defn fixing 
    "A version of fix that fits better with the unified update model: instead of multiple clauses, 
    additional args to the transform function are permitted. For example, 
    (swap! my-atom fixing map? update-in [k] inc)" 
    [x pred transform & args] 
    (if ((as-fn pred) x) 
    (apply (as-fn transform) x args) 
    x)) 

उत्तर

12

एकीकृत अद्यतन मॉडल एपीआई सम्मेलन जिससे विभिन्न संदर्भ प्रकार की वस्तुओं के लिए एक सुसंगत तरीके से अद्यतन किया जा सकता, विशेष कार्यों के साथ यद्यपि है:

;; Atoms 
(swap! the-atom f …) 

;; Agents 
(send the-agent f …) 
(send-off the-agent f …) 
;; send-via takes an additional initial argument, but otherwise 
;; follows the same convention (and of course it's an exact match 
;; when partially applied – (partial send-via some-executor)) 
(send-via executor the-agent f …) 

;; Refs 
(dosync 
    (alter the-ref f …) 
    (commute the-ref f…)) 

प्रत्येक मामले f में समारोह है कि ऐसा करना चाहिए है एटम/एजेंट/रेफ, द्वारा रखे गए मान को अपडेट करने के लिए इस्तेमाल किया जाना चाहिए, यदि कोई है (उदाहरण के लिए (swap! the-atom f 1 2 3)), और कॉल का नतीजा यह है कि संदर्भ परमाणु मूल्य (f old-value …) मान लेगा - हालांकि वास्तव में जब ऐसा होगाके संबंध में/alter/send/... कॉल संदर्भ प्रकार और उपयोग किए गए अद्यतन फ़ंक्शन पर निर्भर करता है।

यहाँ एक उदाहरण है:

(def a (atom 0)) 
(swap! a - 5) 
@a 
;= -5 

Vars आम तौर पर इसी उद्देश्य से एक के लिए उपर्युक्त संदर्भ प्रकार का उपयोग हो सकता है कि के लिए इस्तेमाल किया जा नहीं होती हैं, लेकिन वे भी एक ही अनुबंध के साथ एक अद्यतन कार्य हो :

(alter-var-root #'the-var f …) 

अंत में, update और update-in कार्यों इस संबंध में उल्लेख के लायक हैं; प्रभाव में, वे मूल्यों को एकीकृत अद्यतन मॉडल सम्मेलन का विस्तार - अब जाहिर है, मूल्यों, अपरिवर्तनीय हैं, इसलिए बुला update या update-in किसी भी वस्तु दिख जा रहा है बदल में परिणाम नहीं करता है, लेकिन वापसी मान परिणाम के रूप में इसी तरह का उत्पादन किया है

(update {:foo 1} :foo inc) 
;= {:foo 2} 

fixing समारोह सवाल में उद्धृत fix UUM अद्यतन कॉल के संदर्भ में (एक ही नाम स्थान में परिभाषित) की तुलना में बेहतर काम करता है, क्योंकि यह: कुछ अतिरिक्त तर्क एक पहले से मौजूद मूल्य और संभवतः के लिए एक अद्यतन समारोह को लागू करने की कई तर्कों को इस तरीके से पारित किया जा सकता है कि यूयूएम अपडेट कैसे कार्य करता है के swap! काम, जबकि fix के साथ आपको एक अनाम कार्य का उपयोग करना होगा:

;; the example from the docstring of fixing 
(swap! my-atom fixing map? update-in [k] inc) 

;; modified to use fix 
(swap! my-atom fix map? #(update-in % [k] inc)) 
संबंधित मुद्दे