Truy cập vào lịch sử của một 'ref` trong Clojure


9

Các tài liệu cho ref show a: tùy chọn max-lịch sử và tiểu bang rằng "refs tích lũy lịch sử tự động khi cần thiết để đối phó với nhu cầu đọc." Tôi có thể thấy rằng có lịch sử tại REPL, nhưng tôi không thấy cách tìm các giá trị trước đó của một 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

Có lẽ thế giới đã có các giá trị "xin chào", "tốt hơn" và "tốt hơn !!!". Làm thế nào để tôi truy cập vào lịch sử đó?

Nếu không thể truy cập vào lịch sử đó, liệu có một kiểu dữ liệu lưu giữ lịch sử các giá trị của nó có thể được truy vấn sau đó không? Hoặc đó là lý do tại sao cơ sở dữ liệu datomic được tạo ra?

Câu trả lời:


7

Tôi tin rằng: min-history và: max-history chỉ đề cập đến lịch sử của một ref trong một giao dịch.

Tuy nhiên, đây là một cách để làm điều đó với một nguyên tử và người theo dõi:

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

Điều này cũng sẽ làm việc tương tự với các nguyên tử?
Yazz.com
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.