有没有办法编写 ghci 会话脚本?
Is there a way to script a ghci session?
我的目标是将 ghci
的一些步骤从 bash 脚本传送到 运行,然后干净地退出。网上的评论says使用runhaskell
这个。
这是 command 我正在尝试 运行:
ghci> import System.Random
ghci> random (mkStdGen 100) :: (Int, StdGen)
预期结果类似于:
(-3633736515773289454,693699796 2103410263)
当我将其放入文件 randomtest.hs
并使用 runhaskell
执行它时,出现以下错误:
randomtest.hs:3:1: error:
Invalid type signature: random (mkStdGen 100) :: ...
Should be of form <variable> :: <type>
看来我不能使用runhaskell
方法来盲目执行ghci
输入。
现在解决这个问题的方法是向传递给 runhaskell
的文件添加额外的命令:
main = do print (random (mkStdGen 100) :: (Int, StdGen))
我的目标是为我正在使用的 haskell 课程自动化 运行ning ghci 工作。我希望能够从 bash 脚本中 运行 ghci 命令 - 以 ghci 期望的格式,并让它干净地退出 ghci(或任何 运行s 它)。
我的问题是:有没有办法编写 ghci 会话脚本?
为此您需要使用 expect,它允许您使用简单的命令以交互方式控制 REPL。这个脚本做你想做的事:
#!/usr/bin/env expect
log_user 0
spawn ghci
log_user 1
expect ".*> "
send ":set prompt \"ghci> \"\n"
expect "ghci> "
send "import System.Random\n"
expect "ghci> "
send "random (mkStdGen 100) :: (Int, StdGen)\n"
interact
运行 这为您提供以下内容:
$ ./ghci-interactive
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :set prompt "ghci> "
ghci> import System.Random
ghci> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
ghci>
注意:您可能需要稍微调整一下以防止用户在 ~/.ghci
中设置提示。
谢谢@SilvanMosberger - 你解决了这个问题所以我会留下你的正确。
我想推广这种方法,以便它可以加载文件中指定的指令 - 例如 RandomPair.ghci
具有以下内容:
import System.Random
random (mkStdGen 100) :: (Int, StdGen)
random (mkStdGen 949488) :: (Float, StdGen)
random (mkStdGen 949488) :: (Bool, StdGen)
random (mkStdGen 949488) :: (Integer, StdGen)
现在 运行 的脚本看起来像文件 RandomPair-ghci.bash
#!/usr/bin/env expect
log_user 0
spawn ghci
log_user 1
expect ".*> "
send ":set prompt \"ghci> \"\n"
set f [open "RandomPair.ghci"]
set replcommands [split [read $f] "\n"]
close $f
foreach replcommand $replcommands {
set replcommand1 [string map {"\"" "\\""} $replcommand]
expect "ghci> "
send -- "$replcommand1 \n"
}
expect "ghci> "
send ":quit\n"
interact
结果类似于:
$ ./RandomPair-ghci.bash
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> :set prompt "ghci> "
ghci> import System.Random
ghci>
ghci>
ghci> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
ghci> random (mkStdGen 949488) :: (Float, StdGen)
(0.3718226,1597344447 1655838864)
ghci> random (mkStdGen 949488) :: (Bool, StdGen)
(False,1485632275 40692)
ghci> random (mkStdGen 949488) :: (Integer, StdGen)
(9159618695640234475,587416689 2103410263)
ghci>
ghci>
ghci> :quit
Leaving GHCi.
$
我的目标是将 ghci
的一些步骤从 bash 脚本传送到 运行,然后干净地退出。网上的评论says使用runhaskell
这个。
这是 command 我正在尝试 运行:
ghci> import System.Random
ghci> random (mkStdGen 100) :: (Int, StdGen)
预期结果类似于:
(-3633736515773289454,693699796 2103410263)
当我将其放入文件 randomtest.hs
并使用 runhaskell
执行它时,出现以下错误:
randomtest.hs:3:1: error:
Invalid type signature: random (mkStdGen 100) :: ...
Should be of form <variable> :: <type>
看来我不能使用runhaskell
方法来盲目执行ghci
输入。
现在解决这个问题的方法是向传递给 runhaskell
的文件添加额外的命令:
main = do print (random (mkStdGen 100) :: (Int, StdGen))
我的目标是为我正在使用的 haskell 课程自动化 运行ning ghci 工作。我希望能够从 bash 脚本中 运行 ghci 命令 - 以 ghci 期望的格式,并让它干净地退出 ghci(或任何 运行s 它)。
我的问题是:有没有办法编写 ghci 会话脚本?
为此您需要使用 expect,它允许您使用简单的命令以交互方式控制 REPL。这个脚本做你想做的事:
#!/usr/bin/env expect
log_user 0
spawn ghci
log_user 1
expect ".*> "
send ":set prompt \"ghci> \"\n"
expect "ghci> "
send "import System.Random\n"
expect "ghci> "
send "random (mkStdGen 100) :: (Int, StdGen)\n"
interact
运行 这为您提供以下内容:
$ ./ghci-interactive
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :set prompt "ghci> "
ghci> import System.Random
ghci> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
ghci>
注意:您可能需要稍微调整一下以防止用户在 ~/.ghci
中设置提示。
谢谢@SilvanMosberger - 你解决了这个问题所以我会留下你的正确。
我想推广这种方法,以便它可以加载文件中指定的指令 - 例如 RandomPair.ghci
具有以下内容:
import System.Random
random (mkStdGen 100) :: (Int, StdGen)
random (mkStdGen 949488) :: (Float, StdGen)
random (mkStdGen 949488) :: (Bool, StdGen)
random (mkStdGen 949488) :: (Integer, StdGen)
现在 运行 的脚本看起来像文件 RandomPair-ghci.bash
#!/usr/bin/env expect
log_user 0
spawn ghci
log_user 1
expect ".*> "
send ":set prompt \"ghci> \"\n"
set f [open "RandomPair.ghci"]
set replcommands [split [read $f] "\n"]
close $f
foreach replcommand $replcommands {
set replcommand1 [string map {"\"" "\\""} $replcommand]
expect "ghci> "
send -- "$replcommand1 \n"
}
expect "ghci> "
send ":quit\n"
interact
结果类似于:
$ ./RandomPair-ghci.bash
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> :set prompt "ghci> "
ghci> import System.Random
ghci>
ghci>
ghci> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
ghci> random (mkStdGen 949488) :: (Float, StdGen)
(0.3718226,1597344447 1655838864)
ghci> random (mkStdGen 949488) :: (Bool, StdGen)
(False,1485632275 40692)
ghci> random (mkStdGen 949488) :: (Integer, StdGen)
(9159618695640234475,587416689 2103410263)
ghci>
ghci>
ghci> :quit
Leaving GHCi.
$