在ocaml
或ghci
顶层工作时,我经常为更好的单词,值绑定,函数,模块加载等等构建一个重要的“上下文”。有没有办法保存所有这些,并在以后重新加载,这样我就可以继续我刚刚离开的地方了?或者更好的是,将整个批次转储为一个文本文件,可以将其重新加载或修改为可编译为可执行文件的代码(例如,通过添加Main)。以后保存我的运行顶层
回答
HOL light的用户有类似的需求,他们使用检查点程序来保存顶层的快照。请参阅caml邮件列表上的this message或this HOL tutorial的第8页。
通常最好将定义保留为源代码,而不是二进制顶层快照。许多工具允许将.ml文件快速加载到顶层以便于实验(emacs模式等)。见警告在HOL教程:
在开发中HOL大样张,你应该始终保持证明脚本 的OCaml的文件准备好重新加载,而不是依靠CKPT。这将允许稍后对样本 进行修改,供其他人使用。但是,制作 中间快照可能非常方便,因此您无需加载大型文件即可进一步处理证据。 这与编程中的常见情况类似:您应该始终保持您的 完整的源代码,但不希望每次使用 代码时都重新编译所有源。
至少在OCaml中没有内置的支持。解决方法是使用rlwrap或任何其他readline包装器将输入的历史记录记录到文件中。例如:
> rlwrap -H mysession.ml ocaml
缺点是,这也会记录有语法错误的输入,因此您必须清除它。请注意,默认情况下,如果您在不使用-H选项的情况下调用它,rlwrap会自动将输入保存在〜/ .ocaml_history中。
我已经在我的shell中定义了一个别名,oc ='rlwrap ocaml',所以这很容易做到,并且会让我回到我在#use的位置...我想我想要的是一个等价的shell的“env”命令可以转储出所有的环境变量。 – Gaius 2010-10-19 10:16:09
在Haskell中,只需使用:e file
即可。这将打开标准编辑器,并允许您编辑某个文件。之后,使用:r
重新加载它。它将被自动重新编译。
请注意,在此之后,所有“特设”定义的功能都将丢失。有关更多信息,请参阅文档。
另一种方法是在Emacs中以haskell模式工作,编辑文件并将C-C C-l发送给劣等进程。如果这是双向的,那将是完美的。 – Gaius 2010-10-19 11:53:55
在Emacs中运行ghci,然后从那里运行':e'?不完全认真...... – 2010-10-20 10:40:20
ghci
使用haskeline作为命令行输入历史记录,因此您可以向上滚动以重复/编辑输入。您的输入历史通常被记录在一个文件中,您可以通过
System.Directory.getAppUserDataDirectory "ghc"
有各种指令,探索“语境”(给出的目录中找到作为ghci_history
:显示绑定:显示模块,:闪避, ..)但他们的输出不足以重现你的会话(尽管无论如何都值得了解它们)。
通常,将ghci
会话与打开的编辑器窗口相结合的建议是合理的:如果它不止一次性定义,即使仅用于调试目的,最好将其包含在要加载到ghci
的模块中,以便您可以重复使用它。
哦,如果是'上下文',你的意思是你想加载的一些默认设置或模块,在每个项目的基础上,还有ghci
的configuration file。同样适用于定义您自己的ghci
命令。
在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;;
你自己,如果这是你的意愿。
我使用这种技术,我在Jane街博客上看到一篇关于用最有用/相关的东西来构建“脚本”顶层的文章。但我正在考虑的用例是沿着探索性/实验性工作的路线,我希望能够保持警惕重新启动,或者转移到另一台机器,并从我离开的地方继续。 – Gaius 2010-10-19 19:55:49
链接死亡。请在下次引用相关内容。 – 2017-07-18 15:21:29
- 1. 可以在顶层运行吗?
- 2. 在运行时删除顶层容器
- 3. 在Docker堆栈中运行顶层
- 4. iOS开发:保证顶层
- 5. 保存LINQ-to-SQL事务以便稍后重新运行?
- 6. 我的图像保存功能中的几行不会在第一次保存图像后运行
- 7. 从`docker`升级到`docker-ce`时,我可以保存我的运行容器吗?
- 8. 脚本运行后返回顶部
- 9. 保证我的指针内存容器存在以后?
- 10. 我可以运行泊坞窗图像的中间层吗?
- 11. 我可以在内存中运行LocalDb
- 12. 选择顶层,并在表(SQL Server)的最后行
- 13. sharedPreferences apply()保存所有以上或只是最后一个?怎么运行的?
- 14. 保存生成的冠层
- 15. 在运行时保存xamlx
- 16. 配售窗口后,顶层窗口
- 17. 运行后保存的Python smtplib错误.pyc
- 18. 运行xmlrunner后生成的xml文件在哪里保存?
- 19. 货物没有在顶层文件中运行测试
- 20. 如何使用文件输入在OCaml顶层运行程序?
- 21. 我们可以运行保存在jar文件中的ant文件吗?
- 22. 从Cmake的find_program保存可执行文件,以便它可以由Python运行
- 23. 代码打开文件,运行宏,保存文件,然后运行下一个
- 24. 在保存后类型时运行在wordpress中运行一个函数
- 25. Android - 保持服务正常运行以将数据保存在存储中
- 26. 在顶层POM
- 27. 如何确保我的jQuery .ready在最后运行
- 28. 如何在切换顶层窗口时保持主机背后的对话框?
- 29. 我可以设置ShowDialog()不是最顶层吗?
- 30. 可以在Kotlin中编写函数(即在顶层)。我是否也可以对顶层的单元进行单元测试?
我为此希望的时代。一次又一次地设置“背景”有时让我发疯。 – Daniel 2010-10-19 15:27:27
注:我的赏金是关于Haskell的最佳答案,无论是ghci还是拥抱。 – 2010-10-26 08:50:11
@A。雷克斯:对不起,迟到了,我今天刚看到这个奖。非常感谢你!!! – fuz 2010-11-16 05:53:01