Ich möchte den Vorteil von funktionalen Datenstrukturen (mehrere Versionen von Daten, die Struktur teilen können) haben, aber in der Lage sein, es in einem imperativen Stil zu ändern.Rein funktionale Datenstrukturen mit Copy-on-Write?
Was ich denke (und eine mögliche Verwendung): ein RPG-Spiel, in dem ganze Spielhistorie gespeichert ist (zum Beispiel, um eine Reise in die Vergangenheit zu ermöglichen). Mit Copy-on-Write könnte ich einfach die Struktur, die den Spielstatus hält, klonen und sie modifizieren, indem ich eine neue Runde einführe - aber habe Zugriff auf die früheren Runden (nicht notwendigerweise alle, vielleicht nur ausgewählte Schnappschüsse des Spielstatus), ohne die Strafe, jedes Mal alles kopieren zu müssen.
Sagen wir foo
ist eine Karte.
bar = foo.clone()
Nichts von foo
‚s-Struktur (zB Baum) wird noch kopiert. von jetzt an bar
wird als Kopie behandelt und keine Änderungen dürfen zurück zu `foo 'propagieren. Jetzt
baz = bar[someKey]
baz.modifyInSomeWay()
- ein neues Objekt erstellt wird, das ist eine modifizierte Kopie von
baz
. bar
ist mit einer neuen Karte ersetzt, das Halten neuebaz
(möglicherweise einigefoo
‚s Struktur beibehalten).foo
ist nicht betroffen.
Aber wenn wir dann tun ...
baz.modifyAgain()
... baz
kann nur geändert werden, weil wir eine neue Version davon haben. bar
muss nicht geändert werden.
All dies erfordert hält einige Versionsinformationen über foo
und bar
, es auf foo.clone()
erhöht und es baz
irgendwie vorbei (indem sie es ein Proxy-Objekt?).
Auch jeder Teil der Struktur, der geklont wurde, wird zu einem "Teil der Historie" und kann nicht mehr geändert werden, was zur Laufzeit erzwungen werden könnte.
Dies ähnelt Prototypen ein bisschen des JavaScript, aber ich, dass es mehr als es nach oben für Änderungen fortzupflanzen ermöglicht. Ich denke, es wäre so etwas wie ein Versionskontrollsystem.
- Wurde dies getan, und in welchem Umfang?
- Ist das eine gute Idee? Wenn nicht, gibt es eine Möglichkeit, es zu speichern?
- Wie könnte es implementiert werden? Ich dachte darüber nach, es auf einer höheren GC-ed-Sprache wie Python aufzubauen.
wahrscheinlich [pyrsistent] (https://github.com/tobgu/pyrsistent) ist das, was Sie suchen – CAMOBAP