通过Emacs评估ghci或拥抱中的缓冲区

Sar*_*rah 10 emacs haskell sml

在Emacs中使用sml-mode我已经能够使用我的缓冲区内容直接发送到较差的SML进程C-c C-b.现在我想只用Haskell做同样的事情.Haskell模式似乎不支持这个,所以我想知道:用Emacs和Haskell来解决这个问题的正确方法是什么?

在学习SML时,我一直在使用C-c C-b几乎不间断的方式轻松评估我的程序,立即看到分配值等的结果.但是如果我C-c C-l在包含两行的保存文件中使用haskell模式,let foo = "foo"并且let bar = "bar"- 我得到"parse error (possibly incorrect indentation)"

Jes*_*erg 9

我认为你正在犯一个常见的新手错误,混淆你在ghci的repl中写的内容和你在haskell源文件中写的内容.

所有sml解释器都是这样制作的,你可以将任何顶级声明写入repl,换句话说:你可以在sml文件中写入任何内容,你可以写入sml解释器.因此,您可以写入val foo = "bar"文件并用于C-c C-b 加载文件,您可以直接val foo = "bar"进入解释器.

另一方面,由于haskell如何工作,你可以写入let foo = 42ghci,但它不是一个有效的顶级声明,因此这不能在haskell源文件中(由它自己).另一方面,你可以拥有id n = n一个haskell源文件并用于C-c C-l加载文件,但是你不能直接将它写入ghci(你会得到一个错误:: 1:6:解析错误输入'=').这样做的原因是ghci中的repl在IO monad中运行,因此你写入ghci的内容必须使用do符号来完成.我只能建议您在使用GHCi用户指南的提示下阅读交互式评估.

C-c C-b在sml-mode中与C-c C-lhaskell模式完全相同,至少在概念上是这样.我不太了解haskell-mode的内部结构,但是在sml-mode C-c C-b中,在解释器中执行一些sml代码,通常是use(...)函数.在haskell模式下,它似乎只是执行:load "..."ghci命令


sep*_*p2k 5

你不能用ghci(或拥抱)做到这一点,原因很简单,你不能在ghci(或拥抱)中编写顶级定义.因此,即使您手动将文件的内容粘贴到ghci中,您所获得的只是语法错误.

因此,使用Cc Cl加载文件是您可以做的最好的.

  • Jfyi,GHC 7.4将允许GHCi中的顶级数据/类型/新类型定义 (5认同)