如何将文本发送到 GHCi 进程?
How to send text to GHCi process?
我正在研究 Haskell presentation engine Howerpoint。在 GHCi 中是 运行ning。我想创建一个函数,将语句输出到当前 运行ning GHCi 会话。它必须在 Linux 和 Mac 上工作,Windows 不是必需的。函数可能有类型
executeStatement :: String -> IO ()
我已经尝试过的:
getProcessID
和 getParentProcessID
然后发送类似
的内容
echo 'xxx' > /proc/92856/fd/1
-bash: /proc/92856/fd/1: No such file or directory
我也试过 runCommand
但它在 Bash 中执行命令而不是在 GHCi 中执行命令所以我得到错误提示找不到命令
xdotool
不 运行 mac
您可以使用像 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 被管道化,stdout 和 stderr 被继承:
{-# 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.
我正在研究 Haskell presentation engine Howerpoint。在 GHCi 中是 运行ning。我想创建一个函数,将语句输出到当前 运行ning GHCi 会话。它必须在 Linux 和 Mac 上工作,Windows 不是必需的。函数可能有类型
executeStatement :: String -> IO ()
我已经尝试过的:
的内容getProcessID
和getParentProcessID
然后发送类似echo 'xxx' > /proc/92856/fd/1 -bash: /proc/92856/fd/1: No such file or directory
我也试过
runCommand
但它在 Bash 中执行命令而不是在 GHCi 中执行命令所以我得到错误提示找不到命令xdotool
不 运行 mac
您可以使用像 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 被管道化,stdout 和 stderr 被继承:
{-# 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.