Clojure -Namespace -Verwaltung - Gibt es eine Möglichkeit, den Zustand der Clojure -Replays, Importe usw. zu speichern und wiederherzustellen?

StackOverflow https://stackoverflow.com/questions/3480377

Frage

Clojure verfügt über eine große Anzahl von Funktionen/Makros für die Arbeit mit Namespaces und Java -Paketimporten. Zu meinem (begrenzten) Verständnis der Einrichtung von Namespaces kann in einem Clojure -Prozess (Repl) als Zustand betrachtet werden.

Wenn ich iterativ an einer Repl -Sitzung arbeitet, insbesondere wenn Quelldateien (wieder) geladen werden, kann ich es leicht finden, verwirrt zu werden - oft, wenn ich einen Fehler oder einen Syntaxfehler in der Namespace -Konfiguration mache. In anderen Fällen möchte ich den Refactoring -Namespaces/Aliase/Referenzfilter ausprobieren, kann aber nicht leicht aus dem vorhandenen Namespace -Status zurückkehren, ohne die Repon neu zu starten.

Zum Beispiel möchte ich in der Lage sein, den Namespace -Konfiguration zu überprüfen - z. Testen Sie sofort eine Quelldatei, die eine gefilterte Teilmenge von Methoden in dieser Bibliothek als Teil des NS -Makros importiert.

Können Leute Möglichkeiten empfehlen, die Namespace -Konfiguration zu speichern und wiederherzustellen?

War es hilfreich?

Lösung

Ich bin sicher, dass es gibt etwas Falsch damit, wie ich es gerade als Antwort auf diese Frage geschrieben habe, aber ich sehe mich sicher, dass ich dies in meinen Projekten benutze. Nur: Importieren Sie es (haben Sie es in einer eigenen Datei in Ihrem Projekt) und verwenden Sie es großzügig.

(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))

Zuerst, retten Sie den Zustand Ihrer Welt (in dem Sie zurückkehren möchten) wie folgt:

(def *save* (save-world))

Dann Mach was du willst - Experiment. Wenn Sie bereit sind, in Ihren früheren Staat zurückzukehren:

(destroy-world-but '*save*)
(restore-world *save*)

Und du solltest gut gehen!

(Ich hoffe, das funktioniert! Ich habe für mich gearbeitet - bitte lassen Sie mich wissen, ob es ein Problem gibt. Ich bin sicher, dass es auch eine bessere Möglichkeit gibt, dies zu tun, aber das funktioniert und es ist, wie weit ich heute Abend bin. Ich bin sicher, ich bin sicher. LL Revision.)

Andere Tipps

Das wird nicht immer funktionieren. Sie können Vars aus einem Namespace mit entfernen ns-unmap, aber andere Code -Teile können immer noch Verweise auf diese Definitionen enthalten.

Clojure hat, weil es auf dem JVM basiert, kein Konzept eines "Gedächtnisbildes" wie einige gemeinsame Lisp- oder Schemas -Implementierungen.

DMTCP kann den Job auf ungeschickte Weise erledigen. Google auf DMTCP: Distributed Multithread -Checkpointing. Ich benutze es, um interaktive OCAML -Programme für Checkpoint zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top