Come con molti modelli di progettazione è possibile implementare questo come funzione in clojure. Dipende un po 'da come rappresenti lo stato nel tuo programma (ref, atomi, agenti) attraverso il processo è molto simile.
È sufficiente aggiungere una funzione watcher al proprio stato agent/ref/atom che aggiunge lo stato all'elenco di annullamenti ogni volta che è presente un aggiornamento. allora la tua funzione di annullamento è solo nella lista degli annullamenti. Questo ha il buon effetto di aggiungere il tuo a alla lista di annullamento, consentendo anche di ripetere
La mia prima impressione è che ref
s potrebbe essere lo strumento corretto per questo perché sarai in grado di ripristinarli tutti in modo coordinato , a meno che, naturalmente, non sia possibile ridurre lo stato dei programmi a una singola identità (nel senso Clojure della parola), non sarebbe necessario un aggiornamento coordinato e un agente funzionerebbe.
fonte
2012-03-23 22:34:40
Una domanda precedente dovrebbe essere se effettivamente avete bisogno di questa mutazione di stato in primo luogo. –
@Alex Taggart: e ovviamente non lo fai (ma ho capito che era il tuo punto;) Ho scritto annulla/ripristina usando solo oggetti immutabili (in Java). Puoi scrivere un annulla/ripeti salvando solo (input dell'utente) e ricreando il tuo "stato" ripetendo i tuoi input fino al momento desiderato. Quindi, quando si desidera annullare da "t5 a t4" non si "riavvolge" da t5 a t4, ma si riproducono gli input da t0 a t4 (e poiché lo si fa in un "modo funzionale", si è garantito per finire con lo stato corretto). Funziona in molti casi e semplifica enormemente l'implementazione di undo/redo IMHO ... – TacticalCoder