如何使用Stack为Haskell设置org-babel

时间:2017-02-07 03:49:55

标签: haskell emacs org-mode literate-programming org-babel

我正在跑步:

  • GNU Emacs 24.4.1
  • Stack Version 1.3.3
  • org-模式
  • Haskell的模式

我已经看过了:

虽然上面的要点看起来很有希望,但我还没有找到任何看起来像是一个权威的方式来运行org-haskell(例如,没有关于melpa的东西),当然也没有什么专门针对任何运行堆栈的复杂性环境,而不是使用我的全球ghc将需要。

当我尝试:

#+BEGIN_SRC haskell
let x = "test"
putStrLn x
#+END_SRC

我得到了

  

执行Haskell代码块

......永远挂起。当我C-g时,我看到了:

GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Some flags have not been recognized: prompt2, ghci     | 
ghci    λ> let x = "TESTING!"
putStrLn x
"org-babel-haskell-eoe"
Prelude| 
<interactive>:4:1: parse error on input `putStrLn'
ghci    λ> "org-babel-haskell-eoe"

当我选中haskell缓冲区时,我发现它已经真实地评估了我发送的内容,它只是出现了这个org-babel-haskell-eoe错误,并且永远不会将控制权返回给我的组织会话。

这是否因为我有自定义提示?使用lambda而不是Prelude&gt; ?

4 个答案:

答案 0 :(得分:5)

这是一个完整的答案:特别是,它甚至没有提到Stack。但是我(对Haskell完全无知)想知道如何让OP的测试程序在babel中运行。这是我发现的:

  • 你需要一个haskell解释器;-)我在Fedora 24上,所以我安装了ghc-compiler软件包,我得到了ghci。

  • 您需要haskell-mode。我使用emacs包管理器从MELPA安装了它。这也安装了inf-haskell.el

  • 默认情况下,inf-haskell想要运行hugs,因此我自定义haskell-program-name并将其设置为&#34; ghci&#34;。

  • M-x load-library RET ob-haskell RET

  • 代码块上的Cc Cc:第一次失败并且消息缓冲区显示&#34;缓冲区haskell.org不存在或没有进程&#34;。< / p>

  • 但如果再次在代码块上执行C-c C-c,它会成功!

显然,ob-haskell.el需要做一些工作 - 而且在我们进入Stack之前就已经知道了,其中我知道甚至比我知道的Haskell还要少,所以我将其作为一个练习感兴趣的读者:-)

编辑:Re。版本信息(在评论中要求):我保持接近最前沿。在这个时间点(2017-05-01),我运行Org mode version 9.0.5 (release_9.0.5-444-g998576 @ /home/nick/elisp/org-mode/lisp/)GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.20.10) of 2017-04-14

答案 1 :(得分:2)

在安装{% extends 'base.html' %} {% load django_tables2 %} {% block pagecontent %} <form id="form" action="/" method="post"> {% csrf_token %} <div> <h3>SCC Info Table</h3> <table> {% render_table table %} </table> </div> <input type="submit" value="Save" id="save" class="btn" formmethod="post" /> </form> {% endblock %} stack(带有堆栈本身)之后,我要做的是在emacs中安装ghci,然后将它们添加到intero中:

init.el

之后,我可以在haskell代码块中进行C-c C-c操作,并在该代码块下获得结果。

答案 2 :(得分:1)

就我而言,它是 .ghci,就像 Testare 的一样。当我注释掉 :set prompt "λ " 时,emacs 停止了冻结,但给出了消息 ‘org-babel-script-escape’ expects a string。必须注释掉 :set +t 才能使其工作。

答案 3 :(得分:0)

可能是因为自定义提示:我有同样的问题,当我删除“:set + t”和“:set prompt”GHCI&gt;“来自〜/ .ghci时,它起作用。我摆弄了它有一些,似乎它会工作,只要你的自定义提示没有任何空格,除了结束(我改变我的“GHCI&gt;”,它的工作原理)。它似乎是它解析的正则表达式来自的信息假定提示中没有空格。