Mengakses riwayat `ref` di Clojure

9

The dokumentasi untuk ref menunjukkan sebuah: Opsi max-sejarah dan menyatakan bahwa "ref menumpuk sejarah dinamis yang diperlukan untuk menangani tuntutan membaca." Saya dapat melihat bahwa ada riwayat di REPL, tetapi saya tidak melihat bagaimana menemukan nilai-nilai ref sebelumnya:

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

Agaknya dunia telah memiliki nilai "halo", "lebih baik", dan "lebih baik !!!". Bagaimana cara mengakses riwayat itu?

Jika tidak mungkin untuk mengakses riwayat itu, apakah ada tipe data yang menyimpan riwayat nilai-nilainya yang dapat ditanyakan sesudahnya? Atau mengapa database datomic dibuat?

GlenPeterson
sumber

Jawaban:

7

Saya percaya: min-history dan: max-history hanya merujuk riwayat wasit selama transaksi.

Namun, inilah cara untuk melakukannya dengan atom dan pengamat:

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
sumber
Apakah ini akan bekerja sama dengan atom juga?
Yazz.com