Zugriff auf die Geschichte eines "Ref" in Clojure


9

Die Dokumentation für ref zeigt eine Option: max-history und besagt, dass "refs den Verlauf dynamisch akkumulieren, wenn dies erforderlich ist, um Leseanforderungen zu erfüllen". Ich kann sehen, dass es bei der REPL einen Verlauf gibt, aber ich sehe nicht, wie ich frühere Werte einer Referenz finden kann:

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

Vermutlich hatte die Welt die Werte "Hallo", "besser" und "besser !!!". Wie greife ich auf diesen Verlauf zu?

Wenn es nicht möglich ist, auf diesen Verlauf zuzugreifen, gibt es einen Datentyp, der einen Verlauf seiner Werte speichert, der anschließend abgefragt werden kann? Oder wurde deshalb die Datendatenbank erstellt?

Antworten:


7

Ich glaube: min-history und: max-history beziehen sich nur auf den Verlauf eines Refs während einer Transaktion.

Hier ist jedoch eine Möglichkeit, dies mit einem Atom und einem Beobachter zu tun:

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!!!"]

Funktioniert das auch mit Atomen?
Yazz.com
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.