Я хочу иметь преимущество функциональных структур данных (несколько версий данных, которые могут совместно использовать структуру), но иметь возможность модифицировать их в императивном стиле.
О чем я думаю (и возможное использование): ролевая игра, в которой хранится вся игровая история (например, чтобы можно было путешествовать во времени). Используя копирование при записи, я мог бы просто клонировать структуру, содержащую состояние игры, и изменить ее, введя новый ход, но имея доступ к более ранним ходам (не обязательно ко всем, может быть, только к выбранным снимкам состояния игры), без наказание за необходимость копировать все каждый раз.
Допустим, foo
— это карта.
bar = foo.clone()
Ничего из структуры foo
(например, дерево) пока не копируется. Однако с этого момента bar
рассматривается как копия, и никакие изменения не могут передаваться обратно в `foo'.
baz = bar[someKey]
baz.modifyInSomeWay()
В настоящее время
- создается новый объект, который является модифицированной копией
baz
. bar
заменяется новой картой, содержащей новыйbaz
(возможно, сохраняя часть структурыfoo
).foo
не затронут.
Но если мы тогда сделаем...
baz.modifyAgain()
...baz
можно просто изменить, потому что у нас есть последняя версия. bar
менять не нужно.
Все это требует хранения некоторой информации о версии foo
и bar
, увеличения ее на foo.clone()
и передачи каким-то образом на baz
(сделав ее прокси-объектом?).
Кроме того, любая клонированная часть структуры становится «частью истории» и больше не может быть изменена, что может быть принудительно выполнено во время выполнения.
Это немного похоже на прототипы JavaScript, но в большей степени позволяет изменениям распространяться вверх. Я думаю, это будет что-то вроде системы контроля версий.
- Было ли это сделано и в какой степени?
- Это хорошая идея? Если нет, то есть ли способ его сохранить?
- Как это могло быть реализовано? Я подумывал о том, чтобы создать его на основе какого-нибудь языка высокого уровня с сборщиком мусора, такого как Python.