如何将文本发送到 GHCi 进程?

How to send text to GHCi process?

我正在研究 Haskell presentation engine Howerpoint。在 GHCi 中是 运行ning。我想创建一个函数,将语句输出到当前 运行ning GHCi 会话。它必须在 Linux 和 Mac 上工作,Windows 不是必需的。函数可能有类型

executeStatement :: String -> IO ()

我已经尝试过的:

您可以使用像 tmux 这样的终端多路复用器在一个窗格中执行 ghci,然后从另一个窗格调用 tmux将击键发送到 ghci.

的命令

tmux load-buffer 允许您将文本加载到 tmux 剪贴板(使用 - 作为从标准输入读取的路径)。

# from within tmux
$ echo foo | tmux load-buffer -
$ tmux show-buffer
foo

tmux paste-buffer 允许您将 tmux 剪贴板的内容粘贴到窗格中:

$ tmux list-panes
0: [127x24] [history 1850/2000, 1343570 bytes] %0
1: [127x24] [history 0/2000, 0 bytes] %2 (active)
$ tmux paste-buffer -t %0

评论中已经提到的另一种选择是使用 process 库启动 ghci 进程,并通过管道标准输入发送命令。

这是一个小程序,它使用我的 process-streaming 帮助程序包 process(不是真的需要,你可以使用 process 单独)。 stdin 被管道化,stdoutstderr 被继承:

{-# LANGUAGE OverloadedStrings #-}

import System.Process.Streaming -- from process-streaming
import Pipes (lift,yield) -- from pipes
import Control.Concurrent (threadDelay)

main :: IO ()
main = executeInteractive program (feedProducer (do
    let delay = lift (threadDelay (1000000*6))
    delay
    yield "4 + 3\n"
    delay
    yield "5 + 3\n"))
  where
    program = (shell "ghci"){ std_in = CreatePipe }

输出为:

$ ./Main
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> 7
Prelude> 8
Prelude> Leaving GHCi.

您可以使用 hackage 中的 ghcid 项目来评估表达式。它们不会在与您当前 运行 相同的会话中进行评估,但您仍然可以在 a 会话中发送表达式并读取它们的输出。 这是一个例子:

import Language.Haskell.Ghcid

main :: IO ()
main = do 
    (g, _) <- startGhci "ghci" (Just ".") True 
    let executeStatement = exec g
    executeStatement "let x = 33"
    executeStatement "x + 8" >>= print . head
    executeStatement "print x" >>= print . head
    stopGhci g

输出为“41”“33”,g代表一个ghci会话。

如果你真的需要在已经 运行 的 ghci 实例中执行表达式,你可以看看这个函数 - startGhci 而不是创建一个新进程,你必须利用现有流程,然后设置 std_in、std_out 和 std_err.