Speicher meinen Lauf Toplevel für später
-
09-10-2019 - |
Frage
Bei der Arbeit in dem ocaml
oder ghci
toplevels ich oft einen signifikanten „Kontext“ aufzubauen Ermangelung eines besseren Wortes, gebunden Werte, Funktionen, Module geladen, und so weiter. Gibt es eine Möglichkeit, es zu speichern, um später alles und neu geladen, damit ich genau fortsetzen kann, wo ich aufgehört? Oder noch besser, werfen die gesamte Partie als Textdatei aus, die neu geladen werden konnte oder trivialerweise in Code modifiziert werden, dass ich in eine ausführbare Datei kompilieren können (beispielsweise durch einen Haupt hinzufügen)?
Lösung
Benutzer von HOL Licht haben ähnliche Bedürfnisse hatte, und sie verwenden, um ein Programm von Prüfpunkten eine Momentaufnahme des Toplevel zu speichern. Siehe Diese Nachricht auf der caml Mailing-Liste, oder Seite 8 von diesem HOL Tutorial .
In der Regel ist es besser, die Definitionen als Quellcode zu halten, anstatt ein binäre Toplevel-Schnappschuss. Zahlreiche Tools ermöglichen es in die Top-Level für die einfache Experimente (Emacs-Modi, etc.), um schnell eine .ml Datei zu laden. Siehe die Warnung im HOL-Tutorial:
Wenn große Beweise in HOL entwickeln, sollten Sie immer halten den Beweis Skript als eine OCaml-Datei bereit, neu zu laden, anstatt auf Ckpt angewiesen zu sein. Dadurch werden die Beweise erlauben Spätere Änderungen von anderen usw. Jedoch verwendet werden, kann es sehr bequem zu machen Zwischen Schnappschüsse, so dass Sie auf einem Beweis nicht weiter große Dateien Arbeit zu laden. Dies ist analog zu der üblichen Situation in der Programmierung: Sie sollten immer halten Sie Ihre vollständiger Quellcode, will aber nicht alle Quellen jedes Mal, wenn Sie neu zu kompilieren verwenden der Code.
Andere Tipps
Mindestens in OCaml gibt es keine integrierte Unterstützung dafür. On-Lösung verwenden rlwrap oder anderer Readline- Wrapper Ihre Eingabe Geschichte aufzeichnen zu eine Datei. Zum Beispiel:
> rlwrap -H mysession.ml ocaml
Der Nachteil ist, dass dies auch die Eingabe aufzeichnen, die Syntaxfehler hatte, so dass Sie, dass out selbst reinigen müssen würden. Beachten Sie, dass standardmäßig rlwrap automatisch speichern Sie Ihre Eingabe in ~ / .ocaml_history, wenn Sie rufen Sie es ohne die Option -H.
In Haskell, nur :e file
verwenden. Dies öffnet den Standard-Editor und lässt Sie eine Datei bearbeiten. Danach verwenden :r
es neu zu laden. Es wird automatisch neu kompiliert werden.
Bitte beachten Sie, dass alle Ihre „Ad-hoc“ definierten Funktionen werden danach verloren. Beachten Sie die doc für weitere Informationen.
ghci
Anwendungen haskeline für Kommandozeilen Eingabe der Geschichte, so dass Sie zu wiederholen blättern kann / edit-Eingänge. Ihre Eingabe Geschichte wird in der Regel in einer Datei aufgezeichnet, die Sie als ghci_history
im Verzeichnis angegeben finden können
System.Directory.getAppUserDataDirectory "ghc"
Es gibt verschiedene Befehle, um den ‚Kontext‘ zu erkunden (: Show Bindings: Show-Module: def, ..), aber ihre Leistung wird nicht ausreichen, um die Sitzung zu reproduzieren (obwohl es wert über sie zu wissen, ist sowieso).
Im Allgemeinen ist die Beratung, um Ihre ghci
Sitzung mit einem offenen Editor-Fenstern zu kombinieren, ist Klang: wenn es mehr als eine Wegwerf-Definition ist, wenn auch nur Zwecke für die Fehlersuche, besser ist sie in einem Modul in ghci
geladen werden, so dass Sie es wieder verwenden.
Ach ja, und wenn durch ‚Kontext‘, Sie einige Standardeinstellung oder Module meinen Sie geladen werden sollen, auf einer Pro-Projektbasis gibt es auch ghci
die Konfigurationsdatei . Auch praktisch für die eigenen ghci
Befehle definieren.
In ocaml, können Sie Ihre eigenen Top-Level bauen. Es löst Problem mit geladener Module zumindest.
http://caml.inria.fr/pub /docs/manual-ocaml/toplevel.html#sec278
Der ocamlmktop Befehl baut toplevels OCaml, den Benutzercode enthält vorbelastet bei der Inbetriebnahme.
Der ocamlmktop Befehl als Argument nimmt einen Satz von .cmo und .cma Dateien, und verknüpft sie mit den Objektdateien, die die OCaml implementieren Höchststufe. Die typische Anwendung ist:
ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo
Dies schafft die Bytecode-Datei mytoplevel, mit dem OCaml Top-Level-System sowie der Code aus den drei .cmo Dateien. Dies Toplevel ist direkt ausführbar und gestartet von:
./mytoplevel
Dies tritt in eine reguläre Toplevel-Schleife, mit der Ausnahme, dass der Code aus foo.cmo, bar.cmo und gee.cmo ist bereits in den Speicher geladen, als ob Sie hatte getippt:
#load "foo.cmo";; #load "bar.cmo";; #load "gee.cmo";;
auf Eintritt in die Top-Level. Die Module Foo, Bar und Gee sind nicht geöffnet, obwohl; Sie müssen noch tun
open Foo;;
selbst, wenn dies ist, was Sie wollen.
Das hat mich immer so gestört, so dass ich einen schnellen Python / erwarten Skript
Es ist nicht sehr poliert. Zum Beispiel Replays es immer die ganze Geschichte und dass langsam sein könnte.