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

时间:2018-03-13 00:12:20

标签: clojure

Clojure正在使用持久性数据结构,有没有办法访问旧版本的矢量或地图,因为它在内部保留它?

让我们说一个Vector,我的意思是因为clojure没有复制完整的结构并且在内部将它保存在树中(参见https://hypirion.com/musings/understanding-persistent-vector-pt-1)并保留旧的结构值,有没有办法使用它来做一些像撤销/重做或重播这样的场景,它使用相同的原理让Datomic检索数据的旧版本,所以即时通讯询问是否有可能在clojure中得到它。

3 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个问题,但只是对旧结构进行了参考。

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

答案 1 :(得分:0)

任何版本的持久性数据结构只要有实时引用就会存活下来。此后,它将收集垃圾。

Clojure持久性向量和映射就像写时复制文件系统,例如Btrfs,它们在概念和内部数据结构中都用来创建实体的每个版本的错觉。很明显。

答案 2 :(得分:0)

根据Kris的评论,使用add-watch似乎是正确的答案, David Nolen在这里描述了这种方法 https://swannodette.github.io/2013/12/31/time-travel