2011-06-27 4 views
7

यह देखते हुए कि एसटीएम का कहना है कि रेफ, एजेंट इत्यादि के 10 मूल्यों का इतिहास है, क्या वे मूल्य पढ़ सकते हैं?क्लोजर के एसटीएम के मूल्यों का इतिहास कैसे पहुंचा जा सकता है?

कारण यह है कि, मैं एजेंटों का एक भार अपडेट कर रहा हूं और मुझे मूल्यों का इतिहास रखने की आवश्यकता है। अगर एसटीएम उन्हें पहले से ही रख रहा है, तो मैं बस उनका इस्तेमाल करूंगा। मुझे एपीआई में फ़ंक्शंस नहीं मिल रहे हैं जो ऐसा लगता है कि वे एसटीएम इतिहास से मूल्य पढ़ते हैं, इसलिए मुझे लगता है कि नहीं, और न ही जावा स्रोत कोड में मुझे कोई तरीका मिल सकता है, लेकिन शायद मैं सही नहीं दिख रहा था।

+0

आपके गिफ्ट गलत हैं। ऐसा कोई इतिहास नहीं है जिसे आप पढ़ सकते हैं क्योंकि कोई इतिहास नहीं है। जब कोई लेनदेन होता है, तो पुराने मानों का संदर्भ नहीं दिया जाता है और कचरा संग्रह के लिए पात्र होते हैं। – Gabe

+0

ओह अब मैं देखता हूं, इतिहास केवल लेनदेन के दौरान आयोजित होता है। जवाब के लिए धन्यवाद। – Hendekagon

उत्तर

9

आप सीधे मूल्यों के इतिहास इतिहास तक नहीं पहुंच सकते हैं। लेकिन तुम मूल्यों के इतिहास को दर्ज करने के add-watch का उपयोग कर सकते:

(def a-history (ref [])) 
(def a (agent 0)) 
(add-watch a :my-history 
    (fn [key ref old new] (alter a-history conj old))) 

हर बार a अद्यतन किया जाता है (एसटीएम लेन-देन करता है) पुराने मूल्य अनुक्रम कि a-history में आयोजित किया जाता है पर conjed कर दिया जाएगा।

क्या आप लेनदेन के दौरान एक एजेंट को मान भेज सकते हैं यहां तक ​​कि वापस लुढ़का लेनदेन के लिए सभी मध्यस्थ मूल्यों के लिए उपयोग, प्राप्त करना चाहते हैं:

(def r-history (agent []) 
(def r (ref 0)) 
(dosync (alter r 
      (fn [new-val] 
      (send r-history conj new-val) ;; record potential new value 
      (inc r))))     ;; update ref as you like 

सभी परिवर्तनों के बाद लेन-देन पूरा, एजेंट r-history निष्पादित किया जाएगा।

+1

+1। यह ध्यान देने योग्य भी है कि कई मामलों में (लगातार डेटा संरचनाओं के लिए धन्यवाद) पिछले मूल्यों को ध्यान में रखते हुए पूरी प्रतियां रखने से काफी कम जगह का उपयोग किया जाएगा। तो यह वास्तव में इतिहास संग्रह करने का एक बहुत ही अंतरिक्ष-कुशल तरीका हो सकता है। – mikera

+0

अतिरिक्त विचारों के लिए धन्यवाद। अंत में मैंने एक clojure.lang.PersistentQueue का इस्तेमाल किया – Hendekagon

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

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