क्लोजर में एक `रेफ` के इतिहास तक पहुँच


9

रेफरी के लिए दस्तावेज़ से पता चलता है एक: अधिकतम-इतिहास विकल्प और कहा गया है कि "refs के रूप में पढ़ने के लिए मांग के साथ सौदा करने के लिए आवश्यक गतिशील इतिहास जमा।" मैं देख सकता हूं कि REPL में इतिहास है, लेकिन मैं यह नहीं देखता कि रेफ के पिछले मूल्यों को कैसे पाया जाए:

user=> (def the-world (ref "hello" :min-history 10))
#'user/the-world
user=> (do
          (dosync (ref-set the-world "better"))
          @the-world)
"better"
user=> (let [exclamator (fn [x] (str x "!"))]
          (dosync
           (alter the-world exclamator)
           (alter the-world exclamator)
           (alter the-world exclamator))
          @the-world)
"better!!!"
user=> (ref-history-count the-world)
2

संभवतः-दुनिया में "हेल्लो", "बेहतर", और "बेहतर !!!" के मूल्य हैं। मैं उस इतिहास तक कैसे पहुँच सकता हूँ?

यदि उस इतिहास को एक्सेस करना संभव नहीं है, तो क्या कोई डेटाटाइप है जो अपने मूल्यों का इतिहास रखता है जिसे बाद में क्वेर किया जा सकता है? या यह कि डेटामिक डेटाबेस क्यों बनाया गया था?

जवाबों:


7

मेरा मानना ​​है: न्यूनतम-इतिहास और: अधिकतम-इतिहास केवल एक लेन-देन के दौरान रेफ के इतिहास को संदर्भित करता है।

हालाँकि, यह एक परमाणु और एक द्रष्टा के साथ करने का एक तरीका है:

user> (def the-world (ref "hello"))
#'user/the-world
user> (def history-of-the-world (atom [@the-world]))
#'user/history-of-the-world
user> history-of-the-world
#<Atom@6ef167bb: ["hello"]>
user> (add-watch the-world :historian
                 (fn [key world-ref old-state new-state]
                   (if (not= old-state new-state)
                     (swap! history-of-the-world conj new-state))))
#<Ref@47a2101a: "hello">
user> (do
        (dosync (ref-set the-world "better"))
        @the-world)
"better"      
user> (let [exclamator (fn [x] (str x  "!"))]
        (dosync
          (alter the-world exclamator)
          (alter the-world exclamator)
          (alter the-world exclamator))
        @the-world)
"better!!!"
user> @history-of-the-world
["hello" "better" "better!!!"]

क्या यह परमाणुओं के साथ भी काम करेगा?
Yazz.com
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.