Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 保存我的顶级跑步记录供以后使用_Haskell_Ocaml_Read Eval Print Loop_Ghci - Fatal编程技术网

Haskell 保存我的顶级跑步记录供以后使用

Haskell 保存我的顶级跑步记录供以后使用,haskell,ocaml,read-eval-print-loop,ghci,Haskell,Ocaml,Read Eval Print Loop,Ghci,在ocaml或ghci顶层工作时,我通常会建立一个重要的“上下文”,以避免使用更好的单词、绑定值、加载函数和模块等。有没有办法保存所有这些内容并稍后重新加载,这样我就可以继续刚才的内容?或者更好的办法是,将整个文件转储为文本文件,可以重新加载,也可以简单地修改成代码,然后编译成可执行文件(例如,添加一个Main)?至少在OCaml中,没有内置的支持。解决方法之一是使用或任何其他readline包装器将输入的历史记录记录到文件中。例如: > rlwrap -H mysession.ml oc

ocaml
ghci
顶层工作时,我通常会建立一个重要的“上下文”,以避免使用更好的单词、绑定值、加载函数和模块等。有没有办法保存所有这些内容并稍后重新加载,这样我就可以继续刚才的内容?或者更好的办法是,将整个文件转储为文本文件,可以重新加载,也可以简单地修改成代码,然后编译成可执行文件(例如,添加一个Main)?

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

> rlwrap -H mysession.ml ocaml

缺点是,这还将记录有语法错误的输入,因此您必须清除这些错误。请注意,默认情况下,如果在不使用-H选项的情况下调用~/.ocaml\u历史记录,rlwrap将自动将输入保存在~/.ocaml\u历史记录中。

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

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

ghci
用于命令行输入历史记录,因此您可以向上滚动以重复/编辑输入。您的输入历史记录通常记录在一个文件中,您可以在以下目录中找到该文件:
ghci\u history

System.Directory.getAppUserDataDirectory "ghc"
有各种各样的命令来探索“上下文”(:show bindings,:show modules,:def,…),但是它们的输出不足以重现您的会话(尽管无论如何都值得了解它们)

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

哦,如果“上下文”指的是您希望加载的一些默认设置或模块,那么在每个项目的基础上,还有
ghci
。还可以方便地定义自己的
ghci
命令。

的用户也有类似的需求,他们使用检查点程序保存顶级的快照。请参阅caml邮件列表上的,或第8页的

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

在HOL中开发大型校样时,应始终保持校样脚本不变 准备重新加载的OCaml文件,而不是依赖于ckpt。这将允许提供证据 待以后修改,供他人使用等。但是,制作起来非常方便 中间快照,这样您就不必加载大文件来进一步处理校样。 这类似于编程中的常见情况:您应该始终保持 完整的源代码,但不希望每次使用时重新编译所有源代码 密码


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

ocamlmktop命令生成包含用户代码的OCaml顶级 启动时预加载

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

    ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo
这将创建字节码文件mytoplevel,其中包含OCaml 顶级系统,加上三个.cmo文件中的代码。这 toplevel可直接执行,由以下人员启动:

    ./mytoplevel
这将进入一个常规的顶级循环,除了 foo.cmo、bar.cmo和gee.cmo已经加载到内存中,就像 您已键入:

    #load "foo.cmo";;
    #load "bar.cmo";;
    #load "gee.cmo";;
在顶层入口。模块Foo、Bar和Gee不是 然而,它是开放的;你还得做什么

    open Foo;;
你自己,如果这是你想要的


这也一直困扰着我,因此我编写了一个快速的python/expect,以便在每个ghci会话开始时重播ghci_历史


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

我的shell中已经定义了一个别名oc='rlwrap ocaml',这样做很容易,而且会让我回到使用#use时的状态。。。我想我想要的是一个相当于shell的“env”命令,该命令转储所有环境变量。另一种方法是在Emacs中的haskell模式下工作,编辑一个文件,然后C-C-l将其发送到下一个进程。如果这是双向的,那就太完美了。这正是我所希望的。一次又一次地设置“上下文”有时会让我发疯。注意:我的悬赏是为了得到关于Haskell的最佳答案,无论是ghci还是hugs。我使用这种技巧,在Jane Street博客上看到了一篇关于用最有用/相关的东西构建“脚本”顶级的帖子。但我想到的用例是探索性/实验性的工作,我希望能够保持警惕,防止重新启动,或者转移到另一台机器,从我中断的地方重新开始。请下次引用相关内容。在课程中的某个时候,您做了一个:!您不希望重复…可能应该过滤:__;命令。当然,你不能防范一切。