Voglio avere il vantaggio di strutture dati funzionali (più versioni di dati che possono condividere la struttura) ma essere in grado di modificarlo in uno stile imperativo.Strutture dati puramente funzionali con copy-on-write?
Cosa sto pensando (e un possibile utilizzo): un gioco RPG in cui è memorizzata la cronologia di un gioco intero (ad esempio, per consentire di viaggiare indietro nel tempo). Usando copy-on-write, potrei semplicemente clonare la struttura tenendo lo stato del gioco e modificarlo introducendo un nuovo turno - ma ho accesso ai turni precedenti (non necessariamente tutti, forse solo le istantanee selezionate dello stato del gioco), senza il pena di dover copiare tutto ogni volta.
Diciamo che foo
è una mappa.
bar = foo.clone()
Nulla di struttura foo
s'(ad esempio, l'albero) viene ancora copiato. Tuttavia, da oggi viene considerato come una copia e nessuna modifica è consentita per propagare indietro a "pippo".
baz = bar[someKey]
baz.modifyInSomeWay()
Ora
- un nuovo oggetto viene creato, che è una copia modificata di
baz
. bar
viene sostituito con una nuova mappa, con nuovobaz
(possibilmente mantenendo una parte della struttura difoo
).foo
non è interessato.
Ma se poi facciamo ...
baz.modifyAgain()
... baz
può essere solo modificata, perché abbiamo una versione recente di esso. bar
non ha bisogno di essere cambiato.
Tutto questo richiede contenente alcune informazioni sulla versione foo
e bar
, aumentandola su foo.clone()
, e passarlo a baz
in qualche modo (rendendolo un oggetto proxy?).
Inoltre, qualsiasi parte della struttura che è stata clonata diventa una "parte della cronologia" e non può più essere modificata, che potrebbe essere applicata in fase di esecuzione.
Questo assomiglia prototipi di JavaScript un po ', ma mi è più in quanto consente per le modifiche per propagarsi verso l'alto. Penso che sarebbe qualcosa di simile a un sistema di controllo della versione.
- È stato fatto e in quale misura?
- È una buona idea? Se no, c'è un modo per salvarlo?
- Come potrebbe essere implementato? Stavo pensando di costruirlo sopra un linguaggio GC di alto livello, come Python.
probabilmente [pyrsistent] (https://github.com/tobgu/pyrsistent) è quello che stai cercando – CAMOBAP