haskell - significado - Guardando mi ejecución en el nivel superior para más adelante
significado de repl (6)
Cuando trabajo en el ocaml
o ghci
toplevels a menudo construyo un "contexto" significativo a falta de una mejor palabra, valores encuadernados, funciones, módulos cargados, etc. ¿Hay alguna manera de guardar todo eso y volver a cargarlo más tarde para que pueda continuar exactamente donde lo dejé? O mejor aún, volcar todo el lote como un archivo de texto que podría ser recargado o trivialmente modificado en un código que yo podría compilar en un ejecutable (por ejemplo, agregando un Main).
Al menos en OCaml no hay soporte incorporado para eso. La solución es usar rlwrap o cualquier otro wrapper de readline para registrar el historial de su entrada en un archivo. Por ejemplo :
> rlwrap -H mysession.ml ocaml
El inconveniente es que esto también registrará la entrada que tenía errores de sintaxis, por lo que tendrá que borrar eso. Tenga en cuenta que, de forma predeterminada, rlwrap guardará automáticamente su entrada en ~ / .ocaml_history si la invoca sin la opción -H.
En Haskell, solo usa :e file
. Esto abre el editor estándar y le permite editar algunos archivos. Después, use :r
para volver a cargarlo. Será recompilado automáticamente.
Tenga en cuenta que todas las funciones definidas "ad-hoc" se perderán después de esto. Consulte el documento para más información.
En ocaml, puedes construir tu propio nivel superior. Resuelve el problema con los módulos cargados al menos.
http://caml.inria.fr/pub/docs/manual-ocaml/toplevel.html#sec278
El comando ocamlmktop construye OCaml a niveles que contienen código de usuario preinstalado en el inicio.
El comando ocamlmktop toma como argumento un conjunto de archivos .cmo y .cma, y los vincula con los archivos de objeto que implementan el conjunto de OCaml. El uso típico es:
ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo
Esto crea el archivo de código de bytes mytoplevel, que contiene el sistema de nivel de OCaml, más el código de los tres archivos .cmo. Este toplevel es ejecutable directamente y se inicia con:
./mytoplevel
Esto ingresa a un bucle de nivel regular, excepto que el código de foo.cmo, bar.cmo y gee.cmo ya está cargado en la memoria, como si hubiera escrito:
#load "foo.cmo";; #load "bar.cmo";; #load "gee.cmo";;
en la entrada al toplevel. Los módulos Foo, Bar y Gee no están abiertos, sin embargo; todavía tienes que hacer
open Foo;;
usted mismo, si esto es lo que desea.
Esto siempre me ha molestado, así que escribí un script rápido de python / expect para reproducir ghci_history al comienzo de cada sesión de ghci.
No está muy pulido. Por ejemplo, siempre reproduce la historia completa y eso podría ser lento.
Los usuarios de la luz HOL han tenido necesidades similares, y utilizan un programa de punto de control para guardar una instantánea de toplevel. Vea este mensaje en la lista de correo de caml o en la página 8 de este tutorial de HOL .
En general, es mejor mantener las definiciones como código fuente, en lugar de una instantánea binaria a nivel general. Numerosas herramientas permiten cargar rápidamente un archivo .ml en el to top para una experimentación fácil (modos emacs, etc.). Ver la advertencia en el tutorial de HOL:
Al desarrollar pruebas grandes en HOL, siempre debe mantener el script de prueba como un archivo OCaml listo para volver a cargar, en lugar de confiar en ckpt. Esto permitirá que las pruebas sean modificadas posteriormente, utilizadas por otros, etc. Sin embargo, puede ser muy conveniente realizar instantáneas intermedias para que no tenga que cargar archivos grandes para trabajar más en una prueba. Esto es análogo a la situación habitual en la programación: siempre debe mantener su código fuente completo, pero no desea volver a compilar todas las fuentes cada vez que use el código.
ghci
usa haskeline para el historial de entrada de la línea de comandos, por lo que puede desplazarse hacia arriba para repetir / editar las entradas. Su historial de entrada generalmente se registra en un archivo, que puede encontrar como ghci_history
en el directorio dado por
System.Directory.getAppUserDataDirectory "ghc"
Hay varios comandos para explorar el ''contexto'' (: mostrar enlaces,: mostrar módulos,: def, ..) pero su salida no será suficiente para reproducir su sesión (aunque de todos modos vale la pena conocerlos).
En general, el consejo de combinar tu sesión de ghci
con una ventana de editor abierto es sensato: si es más que una definición de usar y tirar, incluso si solo es para depuración, mejor incluirlo en un módulo para cargarlo en ghci
, para que puedas reutilizarlo.
Ah, y si por ''contexto'', te refieres a algunos ajustes predeterminados o módulos que deseas cargar, por proyecto, también hay un archivo de configuración de ghci
. También es útil para definir tus propios comandos ghci
.