Quiero tener la ventaja de las estructuras de datos funcionales (múltiples versiones de datos que pueden compartir estructura) pero ser capaz de modificarlo en un estilo imperativo.Estructuras de datos puramente funcionales con copy-on-write?
Lo que estoy pensando (y un posible uso): un juego de rol en el que se almacena el historial completo del juego (por ejemplo, para permitir viajar en el tiempo). Usando copy-on-write, podría simplemente clonar la estructura que contiene el estado del juego y modificarlo introduciendo un nuevo turno, pero tener acceso a los turnos anteriores (no necesariamente todos, tal vez solo instantáneas seleccionadas del estado del juego), sin el pena de tener que copiar todo todo el tiempo.
Digamos foo
es un mapa.
bar = foo.clone()
Nada de la estructura foo
's (por ejemplo, árbol) es copiado todavía. Sin embargo, a partir de ahora bar
se trata como una copia y no se permiten cambios para propagar de nuevo a `foo '.
baz = bar[someKey]
baz.modifyInSomeWay()
Ahora
- un nuevo objeto se crea, que es una copia modificada de
baz
. bar
se reemplaza con un nuevo mapa, con el nuevobaz
(posiblemente conservando parte de la estructura defoo
).foo
no se ve afectado.
Pero si luego hacemos ...
baz.modifyAgain()
... baz
puede ser sólo modificada, porque tenemos una versión reciente de la misma. bar
no necesita ser cambiado.
Todo esto requiere mantener una cierta información sobre la versión de foo
y bar
, aumentarla en foo.clone()
, y pasándolo a baz
alguna manera (por lo que es un objeto proxy?).
Además, cualquier parte de la estructura que ha sido clonada se convierte en una 'parte de la historia' y ya no se puede cambiar, lo que podría aplicarse en tiempo de ejecución.
Esto se asemeja a prototipos de JavaScript un poco, pero lo que es más, ya que permite que los cambios para propagar hacia arriba. Creo que sería algo así como un sistema de control de versiones.
- ¿Se ha hecho esto y en qué medida?
- ¿Es esta una buena idea? Si no, ¿hay alguna manera de salvarlo?
- ¿Cómo podría implementarse? Estaba pensando en construirlo sobre algún lenguaje GC-ed de alto nivel, como Python.
probablemente [pyrsistent] (https://github.com/tobgu/pyrsistent) es lo que está buscando – CAMOBAP