2010-10-19 10 views
27

Al trabajar en los niveles ocaml o ghci, a menudo creo un "contexto" significativo a falta de una palabra mejor, valores vinculados, 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 código que yo podría compilar en un ejecutable (por ejemplo, agregando un Main).Guardar mi nivel de ejecución para más adelante

+1

Los tiempos que he deseado para esto. Configurar el "contexto" una y otra vez a veces me ha vuelto loco. – Daniel

+1

Nota: mi recompensa es por la mejor respuesta con respecto a Haskell, ya sea ghci o abrazos. –

+0

@A. Rex: Perdón por llegar tarde, acabo de ver el premio hoy. ¡¡¡Muchas gracias!!! – fuz

Respuesta

11

Los usuarios de HOL light han tenido necesidades similares, y utilizan un programa de punto de control para guardar una instantánea de toplevel. Consulte this message en la lista de correo de caml o en la página 8 de this HOL tutorial.

En general, es mejor mantener las definiciones como código fuente, en lugar de una instantánea binaria a nivel. Numerosas herramientas permiten cargar rápidamente un archivo .ml en el to top para una experimentación fácil (modos emacs, etc.). Vea la advertencia en el tutorial HOL:

En el desarrollo de grandes pruebas en HOL, siempre se debe mantener la secuencia de comandos como prueba archivo listo para volver a cargar una OCaml, en lugar de depender de CKPT. Esto permitirá que las pruebas sean modificadas posteriormente, utilizadas por otros, etc. Sin embargo, puede ser muy conveniente hacer 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.

10

Al menos en OCaml no hay soporte incorporado para eso. La solución es usar rlwrap o cualquier otro dispositivo de lectura para registrar el historial de su entrada en un archivo. Por ejemplo:

> rlwrap -H mysession.ml ocaml 

El inconveniente es que este también registrará la entrada que tenía errores de sintaxis por lo que tendrá que limpiar 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.

+0

Ya tengo un alias definido en mi caparazón, oc = 'rlwrap ocaml', así que es fácil de hacer y me llevaría de vuelta a donde estaba con #use ... Creo que lo que me gustaría es un equivalente del el comando "env" de shell que vacia todas las variables de entorno. – Gaius

9

En Haskell, simplemente use :e file. Esto abre el editor estándar y le permite editar algunos archivos. Luego, 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.

+1

Una alternativa a esto es trabajar en modo haskell en Emacs, editar un archivo y C-c C-l para enviarlo al proceso inferior. Si eso fuera bidireccional, sería perfecto. – Gaius

+1

Ejecute ghci dentro de Emacs, luego ': e' desde allí? No del todo en serio ... –

7

ghci usa haskeline para el historial de entrada de línea de comandos, por lo que puede desplazarse hacia arriba para repetir/editar las entradas. Su historial de entrada que se registra en un archivo, que se puede encontrar como ghci_history en el directorio dado por

System.Directory.getAppUserDataDirectory "ghc" 

Hay varios comandos para explorar el 'contexto' (: Mostrar enlaces,: módulos de demostración, def, ..) pero su salida no será suficiente para reproducir su sesión (aunque de todos modos vale la pena saber de ellos).

En general, el consejo de combinar su sesión ghci con una ventana de editor abierto es bueno: si es más que una definición descartable, incluso para fines de depuración, mejor incluirla en un módulo para cargar en ghci, para que puedas reutilizarlo

Ah, y si por 'contexto', quiere decir algunas configuraciones predeterminadas o módulos que desea cargar, por proyecto, también hay ghci 's configuration file. También es útil para definir sus propios comandos ghci.

7

En ocaml, puede construir su 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 toplevels OCaml que contienen código de usuario precargado en el arranque.

El comando ocamlmktop toma como argumento un conjunto de archivos .cmo y .cma, y los vincula con los archivos de objetos que implementan el conjunto de planos 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 superior OCaml , más el código de los tres archivos .cmo. Este toplevel es directamente ejecutable y se inicia por:

./mytoplevel 

Esto entra en un bucle de nivel superior regular, excepto en que el código de foo.cmo, bar.cmo y gee.cmo ya está cargado en la memoria, tal como Si hubiera escrito:

#load "foo.cmo";; 
    #load "bar.cmo";; 
    #load "gee.cmo";; 

en la entrada al nivel superior. Sin embargo, los módulos Foo, Bar y Gee no están abiertos a ; usted todavía tiene que hacer

open Foo;; 

usted mismo, si esto es lo que desea.

+0

Utilizo esa técnica, vi una publicación en el blog de Jane Street sobre la construcción de "secuencias de comandos" a niveles con las cosas más útiles/relevantes. Pero el caso de uso en el que estoy pensando está en la línea del trabajo experimental/de exploración, que quiero ser capaz de mantener en guardia contra un reinicio, o para transferir a otra máquina y retomar donde lo dejé. – Gaius

+0

Enlace muerto. Por favor, cite el contenido relevante la próxima vez. –

4

Esto siempre me ha molestado demasiado, así que escribió una pitón rápida/script esperar para volver a reproducir ghci_history al comienzo de cada sesión ghci.

No está muy pulido. Por ejemplo, siempre reproduce la historia completa y eso podría ser lento.

+0

También existe el riesgo de que en algún momento de la sesión haya hecho:! que no quieres repetir ... – Gaius

+1

Probablemente los comandos: ___ se deben filtrar. Y, por supuesto, no puedes protegerte de todo. –

Cuestiones relacionadas