Доступ до історії `ref 'у Clojure


9

Документація реф показує: варіант макс-історії і станів , які «рефов накопичувати історію динамічно по мірі необхідності для угоди з лічених вимог.» Я бачу, що в REPL є історія, але я не бачу, як знайти попередні значення посилання:

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

Імовірно, у світі були значення "привіт", "краще" та "краще !!!". Як я можу отримати доступ до цієї історії?

Якщо немає можливості отримати доступ до цієї історії, чи існує тип даних, який зберігає історію її значень, яку можна буде запитувати згодом? Або це тому, що була створена датомічна база даних?

Відповіді:


7

Я вважаю, що міні-історія та: max-історія посилаються лише на історію посилання під час транзакції.

Однак ось спосіб зробити це за допомогою атома і спостерігача:

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

Чи буде це так само і з атомами?
Yazz.com
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.