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
Respuesta
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.
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.
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
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.
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
Ejecute ghci dentro de Emacs, luego ': e' desde allí? No del todo en serio ... –
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
.
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.
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
Enlace muerto. Por favor, cite el contenido relevante la próxima vez. –
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.
También existe el riesgo de que en algún momento de la sesión haya hecho:! que no quieres repetir ... – Gaius
Probablemente los comandos: ___ se deben filtrar. Y, por supuesto, no puedes protegerte de todo. –
- 1. ¿Dónde debería guardar mi estado de nivel de juego?
- 2. ¿Guarda la memoria de un proceso para usarla más adelante?
- 3. Almacenamiento de la URL del video grabado para guardar en la biblioteca más adelante
- 4. Nivel de ejecución solicitado para un dll
- 5. Cómo almacenar contenido en UIWebView para una carga más rápida más adelante?
- 6. ¿Cómo hago una pausa durante la ejecución, guardo el estado y continúo desde el mismo punto más adelante?
- 7. En svn, ¿puedo revertir un cambio y archivarlo para más adelante?
- 8. árbol de búsqueda Guardar estado de ejecución
- 9. Idiomas interpretados: ¿el nivel más alto es el más rápido?
- 10. js ¿Adelante para otros idiomas?
- 11. ¿Cómo se usa SharedPreferences para guardar más de un valor?
- 12. cómo diseñar un patrón de repositorio para que sea fácil cambiar a otro ORM más adelante?
- 13. ¿Puede OptionParser omitir las opciones desconocidas para procesarlas más adelante en un programa de Ruby?
- 14. Corrección de errores hacia adelante en .NET
- 15. forma más segura de guardar archivos subidos
- 16. WSDL.exe - Genera interfaz así como clase concreta para fake/mocks fácil más adelante
- 17. ¿Cuál es la forma más fácil de guardar una consulta LINQ para su uso posterior?
- 18. Encabezados hacia adelante para contenedores STL
- 19. ¿Cuál es la mejor práctica para marcar las variables que necesita eliminar más adelante en Java?
- 20. ¿Por qué es más costoso descubrir un defecto más adelante en el proceso?
- 21. Agregando más elementos svg a mi documento en tiempo de ejecución
- 22. Perfilado para analizar los accesos de memoria de bajo nivel de mi programa
- 23. Thread.CurrentPrincipal establecido en Application_AuthenticationRequest no se establece más adelante en la aplicación
- 24. redirección hacia adelante o
- 25. Adelante: video tutoriales gratuitos?
- 26. jQuery: elementos de nivel más alto que contienen x
- 27. ¿Dónde debería guardar la clave de "activación" de mi aplicación?
- 28. Error: allowDefinition = 'MachineToApplication' más allá del nivel de aplicación
- 29. Historial XCode (atrás/adelante) ¿Atajo del teclado?
- 30. F # tubería hacia adelante para convertir de int a bigint
Los tiempos que he deseado para esto. Configurar el "contexto" una y otra vez a veces me ha vuelto loco. – Daniel
Nota: mi recompensa es por la mejor respuesta con respecto a Haskell, ya sea ghci o abrazos. –
@A. Rex: Perdón por llegar tarde, acabo de ver el premio hoy. ¡¡¡Muchas gracias!!! – fuz