2010-10-19 65 views
27

ocamlghci顶层工作时,我经常为更好的单词,值绑定,函数,模块加载等等构建一个重要的“上下文”。有没有办法保存所有这些,并在以后重新加载,这样我就可以继续我刚刚离开的地方了?或者更好的是,将整个批次转储为一个文本文件,可以将其重新加载或修改为可编译为可执行文件的代码(例如,通过添加Main)。以后保存我的运行顶层

+1

我为此希望的时代。一次又一次地设置“背景”有时让我发疯。 – Daniel 2010-10-19 15:27:27

+1

注:我的赏金是关于Haskell的最佳答案,无论是ghci还是拥抱。 – 2010-10-26 08:50:11

+0

@A。雷克斯:对不起,迟到了,我今天刚看到这个奖。非常感谢你!!! – fuz 2010-11-16 05:53:01

回答

11

HOL light的用户有类似的需求,他们使用检查点程序来保存顶层的快照。请参阅caml邮件列表上的this messagethis HOL tutorial的第8页。

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

在开发中HOL大样张,你应该始终保持证明脚本 的OCaml的文件准备好重新加载,而不是依靠CKPT。这将允许稍后对样本 进行修改,供其他人使用。但是,制作 中间快照可能非常方便,因此您无需加载大型文件即可进一步处理证据。 这与编程中的常见情况类似:您应该始终保持您的 完整的源代码,但不希望每次使用 代码时都重新编译所有源。

10

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

> rlwrap -H mysession.ml ocaml 

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

+0

我已经在我的shell中定义了一个别名,oc ='rlwrap ocaml',所以这很容易做到,并且会让我回到我在#use的位置...我想我想要的是一个等价的shell的“env”命令可以转储出所有的环境变量。 – Gaius 2010-10-19 10:16:09

9

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

请注意,在此之后,所有“特设”定义的功能都将丢失。有关更多信息,请参阅文档。

+1

另一种方法是在Emacs中以haskell模式工作,编辑文件并将C-C C-l发送给劣等进程。如果这是双向的,那将是完美的。 – Gaius 2010-10-19 11:53:55

+1

在Emacs中运行ghci,然后从那里运行':e'?不完全认真...... – 2010-10-20 10:40:20

7

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

System.Directory.getAppUserDataDirectory "ghc" 

有各种指令,探索“语境”(给出的目录中找到作为ghci_history:显示绑定:显示模块,:闪避, ..)但他们的输出不足以重现你的会话(尽管无论如何都值得了解它们)。

通常,将ghci会话与打开的编辑器窗口相结合的建议是合理的:如果它不止一次性定义,即使仅用于调试目的,最好将其包含在要加载到ghci的模块中,以便您可以重复使用它。

哦,如果是'上下文',你的意思是你想加载的一些默认设置或模块,在每个项目的基础上,还有ghciconfiguration file。同样适用于定义您自己的ghci命令。

7

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

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

的ocamlmktop命令构建含有在启动时预加载用户代码 OCaml的toplevels。

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

ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo 

这将创建字节码文件mytoplevel,包含OCaml的顶层 系统,加上来自三个.cmo文件中的代码。这 顶层是直接执行,由开始:

./mytoplevel 

这进入正规顶层循环,除了从 foo.cmo,bar.cmo和gee.cmo代码已经被加载到内存中,就像如果 你输入了:在入口处顶级

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

。不过,模块Foo,Bar和Gee并不是 ;你还必须做

open Foo;; 

你自己,如果这是你的意愿。

+0

我使用这种技术,我在Jane街博客上看到一篇关于用最有用/相关的东西来构建“脚本”顶层的文章。但我正在考虑的用例是沿着探索性/实验性工作的路线,我希望能够保持警惕重新启动,或者转移到另一台机器,并从我离开的地方继续。 – Gaius 2010-10-19 19:55:49

+0

链接死亡。请在下次引用相关内容。 – 2017-07-18 15:21:29

4

这一直困扰着我了,所以我写了一个快速的Python /期望script在每个ghci的会议开始重播ghci_history。

这不是很光滑。例如它总是回放整个历史,可能会很慢。

+0

在你进行的会议中,总会有一些风险:!你不想重复... – Gaius 2010-10-20 23:08:44

+1

可能是:___命令应该被过滤。当然,你无法防范所有事情。 – 2010-10-21 06:15:16

相关问题