Podobnie jak w przypadku wielu wzorców projektowych, można go zaimplementować jako funkcję w clojure. To zależy w niewielkim stopniu od tego, jak reprezentujesz stan w swoim programie (refs, atomy, agenci) w procesie jest bardzo podobny.
Po prostu chcesz dodać funkcję obserwatora do swojego stanu agent/ref/atom, który dodaje stan do listy cofania za każdym razem, gdy pojawia się aktualizacja. wtedy twoja funkcja cofania po prostu wyszukuje je na liście cofania. Ma to dobry efekt dodania twojego do listy cofania, pozwalając na ponowienie również
Moje pierwsze wrażenie jest takie, że ref
s może być właściwym narzędziem do tego, ponieważ będziesz mógł przywrócić je wszystkie w skoordynowany sposób , chyba że możesz ograniczyć swoje programy do jednej tożsamości (w sensie Clojure), to nie potrzebujesz skoordynowanej aktualizacji, a agent będzie działał.
Poprzednim pytaniem powinno być, czy faktycznie potrzebujesz tej mutacji stanu w pierwszej kolejności. –
@Alex Taggart: i oczywiście naprawdę nie (ale rozumiem, że to był twój punkt;) Napisałem cofanie/ponawianie używając tylko niezmiennych obiektów (w Javie). Możesz napisać cofnięcie/ponowienie tylko poprzez zapisanie (dane użytkownika) i ponowne odtworzenie "stanu" poprzez ponowne odtworzenie danych wejściowych do żądanego czasu. Więc jeśli chcesz cofnąć od "t5 do t4", nie "zwijasz" od t5 do t4, ale odtwarzasz wejścia od t0 do t4 (i ponieważ robisz to w "funkcjonalny sposób", jesteś gwarantowane, że skończy się prawidłowym stanem). Działa w wielu przypadkach i znacznie upraszcza wdrażanie undo/redo IMHO ... – TacticalCoder