保存我的跑步以供以后使用

Gai*_*ius 29 ocaml haskell ghci read-eval-print-loop

当我ocaml或者在ghci办公室工作时,我经常会为了更好的单词,值绑定,函数,加载的模块等建立一个重要的"上下文".有没有办法保存所有这些并在以后重新加载它,所以我可以继续我离开的地方?或者更好的是,将整个批次转储为可以重新加载的文本文件,或者将其简单地修改为可以编译成可执行文件的代码(例如通过添加Main)?

gas*_*che 11

HOL灯的用户也有类似的需求,他们使用检查点程序来保存顶层的快照.请参阅caml邮件列表或本HOL教程的第8页上的此消息.

通常,最好将定义保留为源代码,而不是二进制顶级快照.许多工具允许将.ml文件快速加载到顶层以便于实验(emacs模式等).请参阅HOL教程中的警告:

在HOL中开发大型校样时,您应始终将校对脚本保留为OCaml文件,以备重新加载,而不是依赖于ckpt.这将允许稍后修改证明,由其他人使用等.但是,制作中间快照非常方便,因此您不必加载大文件以在证明上进一步工作.这类似于编程中的常见情况:您应始终保留完整的源代码,但不希望每次使用代码时都重新编译所有源代码.


Dan*_*zli 10

至少在OCaml中没有内置的支持.解决方案是使用rlwrap或任何其他readline包装器将输入的历史记录记录到文件中.例如 :

> rlwrap -H mysession.ml ocaml
Run Code Online (Sandbox Code Playgroud)

缺点是,这也将记录具有语法错误的输入,因此您必须清除它.请注意,默认情况下,如果在没有-H选项的情况下调用它,rlwrap将自动将输入保存在〜/ .ocaml_history中.


fuz*_*fuz 10

在Haskell中,只需使用:e file.这将打开标准编辑器,并允许您编辑某个文件.然后,:r用来重新加载它.它将自动重新编译.

请注意,此后所有"ad-hoc"定义的函数都将丢失.有关更多信息,请参阅文档.


cla*_*aus 7

ghci使用haskeline作为命令行输入历史记录,因此您可以向上滚动以重复/编辑输入.您的输入历史记录通常记录在一个文件中,您可以在该文件中找到ghci_history该文件

System.Directory.getAppUserDataDirectory "ghc"
Run Code Online (Sandbox Code Playgroud)

有各种命令可以探索'上下文'(:show bindings,:show modules,:def,..)但是它们的输出不足以重现你的会话(尽管无论如何都值得了解它们).

一般来说,将会话ghci与开放式编辑器窗口结合起来的建议是合理的:如果它不仅仅是一次性定义,即使仅用于调试目的,最好将其包含在要加载的模块中ghci,以便您可以重用它.

哦,如果通过"语境",你的意思是一些默认设置或模块,你想装,在每个项目的基础上,还有ghci配置文件.也可以方便地定义自己的ghci命令.


lar*_*hat 7

在ocaml中,您可以构建自己的顶级.它至少解决了加载模块的问题.

http://caml.inria.fr/pub/docs/manual-ocaml/toplevel.html#sec278

ocamlmktop命令构建OCaml toplevel,其中包含启动时预加载的用户代码.

ocamlmktop命令将一组.cmo和.cma文件作为参数,并将它们与实现OCaml顶层的目标文件链接.典型用途是:

    ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo
Run Code Online (Sandbox Code Playgroud)

这将创建包含OCaml顶级系统的字节码文件mytoplevel,以及三个.cmo文件中的代码.此toplevel可直接执行,并由以下内容启动:

    ./mytoplevel
Run Code Online (Sandbox Code Playgroud)

这会进入一个常规的顶级循环,除了来自foo.cmo,bar.cmo和gee.cmo的代码已经加载到内存中,就像你输入的一样:

    #load "foo.cmo";;
    #load "bar.cmo";;
    #load "gee.cmo";;
Run Code Online (Sandbox Code Playgroud)

在进入顶层.但是,模块Foo,Bar和Gee没有打开; 你还是要做

    open Foo;;
Run Code Online (Sandbox Code Playgroud)

你自己,如果这是你想要的.


Dan*_*kov 5

这一直困扰着我,所以我写了一个快速的python/expect 脚本,在每个ghci会话开始时重放ghci_history.

它不是很精致.例如,它总是重播整个历史记录,而且可能很慢.