Chcę mieć tę zaletę funkcjonalnych struktur danych (wiele wersji danych, które mogą dzielić struktury), ale mogli modyfikować go w bezwzględnej stylu.Czysto funkcjonalne struktury danych z kopiowaniem przy zapisie?
Co myślę o (i ewentualne stosowanie): gra RPG, w której cała historia gry są przechowywane (na przykład, aby pozwolić na podróż w czasie). Korzystając z funkcji kopiowania przy zapisywaniu, mogłem po prostu sklonować strukturę utrzymującą stan gry i zmodyfikować ją, wprowadzając nową turę - ale mając dostęp do wcześniejszych zakrętów (niekoniecznie wszystkich, może po prostu wybranych migawek stanu gry), bez kara za kopiowanie wszystkiego za każdym razem.
Załóżmy, że foo
to mapa.
bar = foo.clone()
Nic struktury foo
„s (na przykład drzewa) dostaje jeszcze skopiowane. Jednak odtąd bar
traktowana jest jako kopia i żadne zmiany nie mogą propagować powrotem do `foo”.
baz = bar[someKey]
baz.modifyInSomeWay()
Teraz
- nowy obiekt zostanie utworzony, który jest zmodyfikowaną kopią
baz
. bar
zostaje zastąpiony nową mapą, zawierającą nowebaz
(prawdopodobnie zachowując część strukturyfoo
).foo
jest nienaruszona.
Ale jeśli mamy wtedy zrobić ...
baz.modifyAgain()
... baz
może być po prostu zmodyfikowany, ponieważ mamy najnowszą wersję. bar
nie trzeba zmieniać.
Wszystko to wymaga posiadania informacji o wersji i bar
foo
, zwiększając ją foo.clone()
i przekazaniem go do baz
jakoś (przez co obiekt proxy?).
Każda część struktury, która została sklonowana, staje się "częścią historii" i nie można jej już zmienić, co można wymusić w czasie wykonywania.
Przypomina prototypów JavaScript w przeglądarce, to trochę, ale to nic więcej, gdyż pozwala na zmiany propagować górę. Myślę, że byłoby to coś w rodzaju systemu kontroli wersji.
- Czy zostało to zrobione, w jakim stopniu?
- Czy to dobry pomysł? Jeśli nie, czy istnieje sposób, aby go zapisać?
- Jak to możliwe? Zastanawiałem się nad budowaniem go na wysokim poziomie GC-ed, takim jak Python.
prawdopodobnie [pyrsistent] (https://github.com/tobgu/pyrsistent) jest tym, czego szukasz – CAMOBAP