这并不是说很难在clojure中引用对象;但一般来说,这些引用是不可变的。它是不可变的,它使得双向链表不可能,因为与单链表不同,如果不在某处创建突变,则不能更改它的任何部分。
看到这一点,假设我有一个单向链表,
a -> b -> c
,并假设我想改变它的头。我可以这样做,改变整个列表。我创建一个新的列表,为头值创建一个新的值,并重新使用尾部:
a'-> b -> c
但是双向链表是不可能的。因此,在clojure和其他功能语言中,我们有时在这种情况下使用zipper。
现在,假设你真的需要Clojure中的可变引用 - 它是如何实现的?嗯,这取决于你所需要的并发语义,Clojure的有vars,refs,等
而且,与deftype,您可以创建一个具有可变字段的对象,而这些可变域可以包含到其他事情的引用。你也可以在clojure中使用原始的java数组来达到同样的目的。
您的数据库将成为内存数据库还是磁盘备份数据库?如果在磁盘上,我认为pointer swizzling的问题比具有可变引用的问题要棘手。
回到功能数据结构的问题,我认为有可能创建具有纯功能语义的B树。这里的第一条线索是它是一棵树,树是面包黄油和功能数据结构的肉。其次,请注意,有些数据库只能以append-only方式工作 - 例如couchDB。从某种意义上讲,这有利于数据库是自己的日志。为了更好地了解这种方法的成本和收益,您可能需要watch Slava Akhmechet's presentation。他的公司RethinkDB最终采用了一种混合方法,IIRC。
我完全不明白这个问题,但出于好奇:为什么链表不能解决问题? – Belun 2010-11-22 08:28:31
我并没有试图实现一个链表,而是提到它,因为我在实现B +树时遇到的问题,即处理对节点的引用,与我在处理链接列表时遇到的问题相同。 – TriArc 2010-11-24 15:33:32