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)"
我认为你正在犯一个常见的新手错误,混淆你在ghci的repl中写的内容和你在haskell源文件中写的内容.
所有sml解释器都是这样制作的,你可以将任何顶级声明写入repl,换句话说:你可以在sml文件中写入任何内容,你可以写入sml解释器.因此,您可以写入val foo = "bar"
文件并用于C-c C-b
加载文件,您可以直接val foo = "bar"
进入解释器.
另一方面,由于haskell如何工作,你可以写入let foo = 42
ghci,但它不是一个有效的顶级声明,因此这不能在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-l
haskell模式完全相同,至少在概念上是这样.我不太了解haskell-mode的内部结构,但是在sml-mode C-c C-b
中,在解释器中执行一些sml代码,通常是use(...)
函数.在haskell模式下,它似乎只是执行:load "..."
ghci命令
你不能用ghci(或拥抱)做到这一点,原因很简单,你不能在ghci(或拥抱)中编写顶级定义.因此,即使您手动将文件的内容粘贴到ghci中,您所获得的只是语法错误.
因此,使用Cc Cl加载文件是您可以做的最好的.