Clojure'da `ref 'tarihine erişme


9

Ref belgeleri bir gösteri: max-tarih seçeneği ve devletler bu "okuma talepleri ile anlaşma gerektiği gibi hakemler dinamik geçmişini biriktirmesi." Ben REPL geçmişi olduğunu görebilirsiniz, ama bir ref önceki değerleri bulmak nasıl görmüyorum:

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

Muhtemelen dünya "merhaba", "daha iyi" ve "daha iyi !!!" değerlerine sahiptir. Bu geçmişe nasıl erişebilirim?

Bu geçmişe erişmek mümkün değilse, daha sonra sorgulanabilecek değerlerinin geçmişini tutan bir veri türü var mı? Yoksa datomik veritabanı bu yüzden mi oluşturuldu?

Yanıtlar:


7

Ben inanıyorum: min-geçmiş ve: max-geçmiş sadece bir işlem sırasında bir ref geçmişini ifade eder.

Ancak, bunu bir atom ve izleyici ile yapmanın bir yolu:

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

Bu atomlar için de geçerli olacak mı?
Yazz.com
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.