【问题标题】:How to set up org-babel for Haskell with Stack如何使用 Stack 为 Haskell 设置 org-babel
【发布时间】:2017-02-07 03:49:55
【问题描述】:

我在跑步:

  • GNU Emacs 24.4.1
  • 堆栈版本 1.3.3
  • 组织模式
  • 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 错误并且永远不会将控制权返回给我的 org 会话。

这可能是因为我有自定义提示吗?使用 lambda 代替 Prelude> ?

【问题讨论】:

  • 您可能会发现这个其他问题很有用:stackoverflow.com/questions/42081379/…
  • 您需要先加载ob-haskell.el(或将haskell 添加到org-babel-load-languages 并重新启动emacs)才能尝试评估haskell 代码块。这至少应该摆脱“没有用于 haskell 的 org-babel-execute 函数”消息。
  • @brittUWaterloo,我相信您与我的这个问题有关。
  • @Nick,ob-haskell.el 从哪里来?
  • 它是“官方”组织模式的一部分:你应该可以只说 (require 'ob-haskell) 并加载它。但我不确定它是否有助于解决除了最初的问题之外的任何问题,你现在可能(或可能没有)已经解决了。

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


【解决方案1】:

不是一个完整的答案:特别是,它甚至没有提到 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

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

    李>
  • 但是如果你再对代码块执行 C-c C-c 就成功了!

显然,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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我正处于看到 org-bable-script escape expects a string 的阶段,但从该函数的文档中不清楚为什么会发生这种情况。
      • :set prompt "&gt; " 效果最好。 &gt; 嵌入在 ob-haskell.el 某处的正则表达式中。
      【解决方案4】:

      我在安装stackghci(带有堆栈本身)之后所做的就是在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 并在代码块下得到结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-23
        • 2020-06-24
        • 1970-01-01
        • 2018-04-15
        • 2017-09-17
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多