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?

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

Apakah ini akan bekerja sama dengan atom juga?
Yazz.com
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.