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

19

我正在运行:

  • GNU Emacs 24.4.1
  • Stack Version 1.3.3
  • org-mode
  • haskell-mode

我查看了以下资料:

尽管上面的 gist 看起来很有希望,但我还没有找到任何官方方法来使 org-haskell 运行(例如,melpa 上没有),而且肯定没有专门针对运行 stack 环境而不是使用全局 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错误,而且从未将控制返回到我的org session。

有可能是因为我使用了自定义提示符吗?使用lambda而不是Prelude>?


您可能会发现这个问题有用:https://dev59.com/6VgQ5IYBdhLWcg3w4n3z - brittAnderson
在尝试评估Haskell代码块之前,您需要加载ob-haskell.el(或将Haskell添加到org-babel-load-languages并重新启动emacs)。这样应该至少可以消除“没有用于Haskell的org-babel-execute函数”的消息。 - NickD
1
@brittUWaterloo,我相信你链接到了我的这个问题。 - Mittenchops
@Nick,ob-haskell.el 是从哪里获取的? - Mittenchops
"org-babel-haskell-eoe" 是一个标记,ob-haskell 使用它来将结果与解释器输出的其余部分分隔开,以便可以剪掉杂质并在 org 模式缓冲区中呈现结果。 - NickD
显示剩余2条评论
4个回答

6
这不是一个完整的答案:特别是,它甚至没有提到Stack。但是我(对Haskell一无所知)想知道在babel中运行OP的测试程序需要什么。这是我发现的:
  • 你需要一个Haskell解释器;-) 我使用Fedora 24,所以我安装了ghc-compiler包并得到了ghci。

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

  • 默认情况下,inf-haskell希望运行hugs,所以我定制了haskell-program-name,并将其设置为“ghci”。

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

  • 在代码块上按C-c C-c:第一次失败,Messages缓冲区显示“Buffer haskell.org不存在或没有进程”。

  • 但如果你再次在代码块上按C-c C-c,它就成功了!

显然,ob-haskell.el需要一些工作 - 而且这还没有涉及到Stack,我对此的了解甚至比我对Haskell的了解还要少,所以我将把这留给感兴趣的读者去练习 :-)
编辑:关于版本信息(在评论中请求):我保持紧跟最新进展。在这个时间点(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

2
很可能是由于自定义提示符引起的:我遇到了同样的问题,当我从~/.ghci中删除“:set +t”和“:set prompt“GHCI>”时,它就可以工作了。我尝试了一些调整,似乎只要您的自定义提示符除末尾以外没有任何空格(我将我的更改为“GHCI> ”并且它可以工作),它就会工作。它似乎假定解析信息的正则表达式不会在提示符中有空格。

2

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


我现在遇到了 org-bable-script escape expects a string 的问题,但是从该函数的文档中并不清楚为什么会出现这种情况。 - Colin Woodbury
:set prompt "> " 最好的效果。> 嵌入在 ob-haskell.el 中的某个正则表达式中。 - tony day

1
安装完stackghci(使用stack自身)后,我做的是在Emacs中安装intero,然后将它们添加到init.el中:
 (setq haskell-process-type 'stack-ghci)
 ((org-babel-do-load-languages
     'org-babel-load-languages
        '((haskell . t)))

之后我可以在Haskell代码块中按C-c C-c,然后在代码块下方得到一个结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接