Я уверен, что что-то неправильно с этим, так как я только что написал это в ответ на этот вопрос, но я вижу себя использующим это в своих проектах, наверняка.Просто: импортируйте его (поместите в отдельный файл в вашем проекте) и используйте его свободно.
(ns world)
(defn save-world
[]
(let [syms (filter identity (distinct (for [i (ns-map *ns*)] (first i))))]
(for [i syms]
(vector i
(ns-resolve *ns* i)))))
(defn destroy-world-but
[saved]
(let [syms (filter identity (distinct (for [i (ns-map *ns*)] (first i))))]
(for [i syms]
(if-not (or (= (ns-resolve *ns* i) (ns-resolve *ns* saved))
(= (ns-resolve *ns* i) (ns-resolve *ns* 'restore-world))
(= (ns-resolve *ns* i) (ns-resolve *ns* '*ns*)))
(ns-unmap *ns* i)))))
(defn restore-world
[saved]
(clojure.core/map
#(intern *ns* (clojure.core/first %) (clojure.core/second %))
saved))
Сначала , сохраните состояние вашего мира (того, которое вы хотитевернитесь к) так:
(def *save* (save-world))
Затем делайте что хотите - экспериментируйте.Когда вы будете готовы вернуться в свое прежнее состояние:
(destroy-world-but '*save*)
(restore-world *save*)
И вам следует идти!
(Надеюсь, это работает! У меня сработало, пожалуйста, дайте мне знатьесли есть проблема. Я уверен, что есть и лучший способ сделать это, но это работает, и это то, как далеко я продвинулся сегодня вечером. Я уверен, что пересмотрю.)