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

时间:2011-10-20 13:26:23

标签: haskell emacs sml

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

sml-mode中的

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

答案 1 :(得分:5)

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

因此,您可以使用C-c C-l加载文件。