這並不是說很難在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