我确定这有问题,因为我只是在回答这个问题时写了它,但我看到自己在我的项目中使用它,当然。只需 :import 它(将它放在项目中自己的文件中)并自由使用它。
(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*)
你应该很高兴去!
(希望这行得通!对我有用——如果有问题请告诉我。我相信也有更好的方法来做到这一点,但这行得通,这就是我今晚走了多远。我确定我会修改的。)