首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Emacs在ghci或hugs中评估缓冲区

通过Emacs在ghci或hugs中评估缓冲区
EN

Stack Overflow用户
提问于 2011-10-20 21:26:23
回答 2查看 1.7K关注 0票数 10

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-22 03:37:30

我认为您正在犯一个常见的新手错误,混淆了可以在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: parse error )。这样做的原因是,ghci中的repl在IO monad中运行,因此您向ghci中写入的任何内容都必须使用do表示法来完成。我只能建议您阅读使用GHCi用户指南中的Interactive evaluation at the prompt

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

票数 9
EN

Stack Overflow用户

发布于 2011-10-20 21:29:32

你不能用ghci (或hugs)来做到这一点,原因很简单,你不能用ghci (或hugs)来写顶层定义。因此,即使您手动将文件的内容粘贴到ghci中,也只能得到一个语法错误。

因此,使用C-c、C-l加载文件是您能做的最好的事情。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7836634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档