การเข้าถึงประวัติของการอ้างอิงใน Clojure


9

เอกสารอ้างอิงการแสดง: ตัวเลือกสูงสุดประวัติศาสตร์และกล่าวว่า "refs สะสมประวัติศาสตร์แบบไดนามิกตามความจำเป็นเพื่อจัดการกับความต้องการอ่าน." ฉันเห็นว่ามีประวัติอยู่ที่ 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

สมมุติว่าโลกมีค่า "สวัสดี", "ดีกว่า" และ "ดีกว่า !!!" ฉันจะเข้าถึงประวัตินั้นได้อย่างไร

หากไม่สามารถเข้าถึงประวัตินั้นมีประเภทข้อมูลที่เก็บประวัติค่าที่สามารถสอบถามได้ในภายหลังหรือไม่? หรือว่าทำไมฐานข้อมูล datomic ถูกสร้างขึ้น?

คำตอบ:


7

ฉันเชื่อว่า: ประวัติย่อและ: ประวัติสูงสุดอ้างถึงประวัติการอ้างอิงระหว่างการทำธุรกรรมเท่านั้น

อย่างไรก็ตามนี่เป็นวิธีที่จะทำกับอะตอมและผู้เฝ้าดู:

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.