如何获取clojure数据结构的旧版本

如何获取clojure数据结构的旧版本,clojure,Clojure,Clojure使用的是持久数据结构,有没有一种方法可以访问vector或maps的旧版本,因为它将其保存在内部 比如说对于一个向量,我的意思是因为clojure没有复制完整的结构并在内部将其保存在树中(请参阅),并且也保留了较旧的结构值,有没有办法使用它来执行诸如撤消/重做或重放之类的操作,它使用与Datomic相同的原理来检索数据的较旧版本,因此,我想问是否有可能在clojure中得到这个信息。我不确定我是否理解这个问题,但只保留一个关于旧结构的参考 (def myOldMap {a 1 b

Clojure使用的是持久数据结构,有没有一种方法可以访问vector或maps的旧版本,因为它将其保存在内部


比如说对于一个向量,我的意思是因为clojure没有复制完整的结构并在内部将其保存在树中(请参阅),并且也保留了较旧的结构值,有没有办法使用它来执行诸如撤消/重做或重放之类的操作,它使用与Datomic相同的原理来检索数据的较旧版本,因此,我想问是否有可能在clojure中得到这个信息。

我不确定我是否理解这个问题,但只保留一个关于旧结构的参考

(def myOldMap {a 1 b 2 c3})
(def myNewMap (assoc myOldMap b 7))

只要存在对持久性数据结构的实时引用,任何版本的持久性数据结构都可以生存。此后,它将接受垃圾收集


Clojure持久化向量和映射类似于写上复制文件系统,无论是在概念上还是在内部数据结构的种类上,它们都用来制造一种错觉,即实体的每个版本都是完全不同的

根据克里斯的评论,使用add watch似乎是正确的答案, David Nolen在这里描述了这种方法

没错,旧版本不会保留。未引用的部分可以进行垃圾收集。你说的“vector的旧版本”是什么意思?您没有引用的对象?您可以在原子中存储一个向量,并使用
addwatch
订阅更改,在订阅服务器
conj
中,将每个新状态添加到另一个原子中存储的列表或向量中。。。