値のstm履歴に直接アクセスすることはできません。しかし、あなたはadd-watchの使用は値の履歴を記録することができます:
(def a-history (ref []))
(def a (agent 0))
(add-watch a :my-history
(fn [key ref old new] (alter a-history conj old)))
a
が更新されるたびに(STMトランザクションはコミット)古い値がa-history
で開催されたシーケンスにconjedされます。
あなたがトランザクション中にエージェントに値を送ることができるとしてもロールバックされたトランザクションのためのすべての中間値へのアクセスを、取得したい場合は、次のトランザクションが終了した後に、
(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
すべての変更をエージェントr-history
が実行されます。
あなたの存在は間違っています。歴史がないのであなたが読むことができる歴史はありません。トランザクションがコミットすると、古い値は参照されなくなり、ガベージコレクションの対象となります。 – Gabe
ああ、私は今見ます、履歴はトランザクション中に開催されます。答えをありがとう。 – Hendekagon