19

我在跑:

  • GNU Emacs 24.4.1
  • 堆栈版本 1.3.3
  • 组织模式
  • 哈斯克尔模式

我浏览过:

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

当我尝试:

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

我明白了

执行 Haskell 代码块

...永远挂起。当我 Cg 时,我看到:

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 会话。

这是因为我有一个自定义提示吗?使用 lambda 而不是 Prelude> ?

4

4 回答 4

6

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

  • 你需要一个 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

  • Cc Cc 在代码块上:第一次失败并且消息缓冲区显示“缓冲区 haskell.org 不存在或没有进程”。

  • 但是如果你在代码块上再做一次 Cc Cc ,它就成功了!

显然,ob-haskell.el需要一些工作——那是在我们到达 Stack 之前,我对 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

于 2017-02-17T16:15:55.810 回答
2

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

于 2021-05-31T03:28:10.347 回答
2

这可能是因为自定义提示:我遇到了同样的问题,当我从 ~/.ghci 中删除 ":set +t" 和 ":set prompt "GHCI >" 时,它起作用了。我摆弄了一些,然后只要您的自定义提示除了结尾之外没有任何空格,它似乎就可以工作(我将我的更改为“GHCI>”并且它可以工作)。似乎是它解析信息的正则表达式假设提示中没有空格。

于 2018-01-11T18:33:59.527 回答
1

我在安装stackghci(使用堆栈本身)之后所做的是安装intero在 emacs 中,然后将它们添加到init.el

 (setq haskell-process-type 'stack-ghci)
 ((org-babel-do-load-languages
     'org-babel-load-languages
        '((haskell . t)))

之后我可以在haskell代码块中抄送抄送,我在代码块下得到一个结果。

于 2019-03-18T13:22:59.097 回答