可以读取与修改哪些版本
普通可变结构的更新覆盖原状态;持久结构把更新结果作为新版本,同时保留旧版本的访问入口。部分持久允许查询所有版本,但只更新最新版本;完全持久允许从任一已有版本继续产生新版本。
从旧版本继续更新可以形成分支,而不是把那份旧版本原地改坏。1989 年 Driscoll 等人的论文系统研究了把有链接关系的普通结构改造成持久结构的方法。
参考:[1]
保留历史的不同代价
保留版本不必每次复制整棵树。路径复制可以只复制发生变化的节点及其祖先,再为新版本保存新的根,其余分支由多个版本共用。
另一类方法在节点中保留带版本信息的字段变化。两种办法把成本分配到不同位置:复制多少节点、查找字段旧值需要多久,取决于底层结构和采用的版本技术。
构建效率与保留责任
旧版本仍被引用时,共享的节点也必须继续存在,因此保留许多历史根仍然有内存代价。持久性不是免费快照,也不是完整数据库事务或磁盘耐久性的同义词。
Clojure 另提供临时可变的 transient 构建阶段,结束后转换回 persistent 结果。官方要求这类临时结构由单线程控制,转换完成后不能再使用它;这种优化有明确使用边界。