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

War es hilfreich?

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.

scroll top