如何用clojure实现时间旅行

How to achieve Time Travel with clojure

有没有一种方法可以在 Clojure 中实现时间旅行,例如,如果我有一个向量(它在内部是一棵实现为持久数据结构的树),有没有一种方法可以实现时间旅行并获得它的先前版本向量? Datomic 在数据库级别所做的事情,因为 Clojure 和 Datomic 共享许多概念,包括作为持久数据结构实现的不可变事实,从技术上讲,向量的旧版本仍然存在。所以我想知道在普通的 Clojure 中是否可以进行时间旅行和获取以前的版本,类似于在数据库级别的 Datomic 中所做的

是的,但是您需要保留对它的引用以便访问它,并防止它被垃圾收集。 Clojurists 经常以这种方式实现 undo/redo;您需要做的就是维护数据的历史状态列表,然后您可以简单地向后退一步。

David Nolen 描述了这种方法 here, and you can find a more detailed example and explanation here

Datomic 是普通的 Clojure。您可以将 Datomic 作为 Clojure 库使用,既可以使用内存数据库(用于版本跟踪),也可以完全不使用数据库。