Clojure에서 'ref'의 역사에 접근


9

ref에 대한 문서 는 : max-history 옵션을 보여 주며 "읽기 요구를 처리하는 데 필요한대로 기록을 동적으로 누적합니다"라고 말합니다. 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

아마도 세계는 "hello", "better"및 "better !!!"값을 가졌을 것입니다. 해당 기록에 어떻게 액세스합니까?

해당 기록에 액세스 할 수없는 경우 나중에 쿼리 할 수있는 값의 기록을 유지하는 데이터 유형이 있습니까? 아니면 왜 데이토 믹 데이터베이스가 만들어 졌습니까?

답변:


7

나는 : min-history와 : max-history는 거래 중 심판의 역사 만 참조한다고 생각합니다.

그러나 원자와 감시자로 수행하는 방법은 다음과 같습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.