Accesso alla cronologia di un "ref" in Clojure

9

La documentazione per ref mostra l'opzione: max-history e afferma che "gli arbitri accumulano la storia dinamicamente secondo necessità per far fronte alle richieste di lettura. " Posso vedere che c'è una cronologia al REPL, ma non vedo come trovare i valori precedenti di un ref:

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

Presumibilmente il mondo ha avuto i valori "ciao", "meglio" e "meglio !!!". Come posso accedere a quella cronologia?

Se non è possibile accedere a quella cronologia, esiste un tipo di dati che conserva una cronologia dei suoi valori che può essere interrogata in seguito? O è per questo che è stato creato il database datomico?

    
posta GlenPeterson 24.02.2013 - 14:50
fonte

1 risposta

7

Credo che: cronologia minima e: cronologia massima si riferiscono solo alla cronologia di un riferimento durante una transazione.

Tuttavia, ecco un modo per farlo con un atomo e un osservatore:

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!!!"]
    
risposta data 25.02.2013 - 05:43
fonte

Leggi altre domande sui tag