Ce n'est pas qu'il est difficile d'avoir des références aux objets dans clojure; mais généralement, ces références sont immuables. C'est l'immuabilité qui rend la liste doublement chaînée impossible, car contrairement à une liste unidirectionnelle, vous ne pouvez en changer aucune partie sans créer de mutation quelque part.
Pour voir cela, supposons que j'ai une liste chaînée,
a -> b -> c
et suppose que je veux changer la tête de celui-ci. Je peux le faire en changeant l'intégralité de la liste. Je crée une nouvelle liste en créant une nouvelle valeur pour la valeur de la tête et de réutiliser la queue:
a'-> b -> c
Mais listes doublement chaînées sont impossibles. Donc, dans clojure, et d'autres langages fonctionnels, nous utilisons parfois un zipper dans de telles situations. Maintenant, supposons que vous ayez vraiment besoin de références mutables dans Clojure - comment le faire? Eh bien, en fonction de la sémantique dont vous avez besoin concurrency, Clojure a vars, refs, atoms, etc.
En outre, avec deftype, vous pouvez créer des objets qui ont des champs mutables, et ces champs mutables peut contenir des références à d'autres choses. Vous pouvez également utiliser des tableaux java raw dans clojure dans le même but.
Votre base de données va-t-elle être une base de données en mémoire ou une base de données sauvegardée sur disque? Si sur le disque, je pense que le problème de pointer swizzling est plus compliqué que d'avoir des références mutables. Pour en revenir à la question des structures de données fonctionnelles, je crois qu'il est possible de créer des arbres B qui ont une sémantique purement fonctionnelle. Le premier indice ici est que c'est un arbre, et les arbres sont le beurre de pain et la viande de structures de données fonctionnelles. Deuxièmement, notez qu'il existe des bases de données qui fonctionnent uniquement en mode append - par exemple, couchDB. Cela a l'avantage que la base de données est son propre journal, dans un sens. Pour avoir une meilleure idée des coûts et avantages de cette approche, vous pouvez vouloir watch Slava Akhmechet's presentation. Son entreprise, RethinkDB, a finalement adopté une approche hybride, l'IIRC.
Je ne comprends pas le problème complètement, mais par curiosité: pourquoi la liste liée - ne pouvait pas résoudre le problème d'une autre manière? – Belun
Je n'essayais pas de mettre en œuvre une liste chaînée, mais l'ai mentionné parce que le problème que j'avais avec l'implémentation d'un arbre B +, c'est-à-dire traiter des références aux nœuds, est le même que celui que je rencontrerais lorsque je traiterais des listes Liées – TriArc