2011-06-27 16 views
7

STM'nin, 10 değerindeki referanslar, temsilciler vb. Bir geçmişi olduğu göz önünde bulundurulduğunda, bu değerler okunabilir mi?Can Clojure'ın STM'in değerler tarihi erişilebilir mi?

Bunun nedeni, bir aracı yükünü güncelleştiriyorum ve değer geçmişini tutmam gerekiyor. STM onları zaten saklıyorsa, onları kullanmayı tercih ederim. API'da STM geçmişinden değerler okudukları gibi görünen işlevleri bulamıyorum, bu yüzden java kaynak kodunda herhangi bir yöntem bulamadım, ama doğru bakmadım.

+0

Kişisel bilgileriniz yanlış. Okuyabileceğiniz bir tarih yok çünkü tarih yok. Bir işlem taahhüt ettiğinde, eski değerler artık referans alınmamaktadır ve çöp toplama için uygundur. – Gabe

+0

Şimdi anlıyorum, tarih sadece bir işlem sırasında tutulur. Cevap için teşekkürler. – Hendekagon

cevap

9

stm geçmiş değerlerine doğrudan erişemezsiniz. Ama add-watch kullanılması değerlerinin tarih yazmak için yapabilirsiniz:

(def a-history (ref [])) 
(def a (agent 0)) 
(add-watch a :my-history 
    (fn [key ref old new] (alter a-history conj old))) 

a her güncellendiğinde (stm hareket iptalleri) eski değer a-history tutulur dizisi üzerine conjed edilecektir.

Eğer işlem sırasında bir ajana değerleri gönderebilir hatta geri alındı ​​işlemler için tüm aracı değerler erişmek, elde etmek istiyorsanız: işlemin bitirdikten sonra için,

(def r-history (agent []) 
(def r (ref 0)) 
(dosync (alter r 
      (fn [new-val] 
      (send r-history conj new-val) ;; record potential new value 
      (inc r))))     ;; update ref as you like 

tüm değişiklikleri r-history aracı çalıştırılacak.

+1

+1. Ayrıca, birçok durumda (kalıcı veri yapıları sayesinde) geçmiş değerlerin tüm kopyaları tutmaktan önemli ölçüde daha az yer tutacağına dikkat etmek de önemlidir. Yani bu aslında tarihin depolanması için çok verimli bir yol olabilir. – mikera

+0

Ek fikirler için teşekkürler. Sonunda bir clojure.lang.PersistentQueue kullandım – Hendekagon

İlgili konular