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?

GlenPeterson
quelle

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!!!"]
Jeff Dik
quelle
Funktioniert das auch mit Atomen?
Yazz.com