1

这有点长,所以请耐心等待!

我在使用 Haskell 程序时遇到了一些麻烦,我必须将其用作 uni 项目的一部分。作为参考,它是Casper

所以,你应该执行一个脚本,它实际上是一个 Bash 脚本来调用 Hugs 解释器,如下所示:

exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES

其中 $FILES 指向 Main.lhs 文件。

在此之后,我需要在解释器中调用一个带有文件路径的函数“编译”。

我需要以脚本方式执行上述操作。我需要这个自动化,因为我正在编写一个将在后台调用 Casper 的程序。

所以我编译了 .lhs 文件。现在我想执行“编译”功能,但我不知道这是怎么做的。我尝试:

./Main compile <a path>

从命令行,但它返回给我一个关于找不到文件“测试”的错误。经过调查,我在 Main.lhs 文件中看到了这些行:

>main :: String -> IO()
>main = compile "test"

>compile :: String -> IO()
>compile s = catch (compile0 False s) handler

[...snipped]

第二行解决了这个问题。现在我的问题是,我如何在编译 main.lhs 后调用“编译”函数并传递一个路径?在解释器中,我只需键入“compile”,它就可以工作,但是在编译 main.lhs 并从命令行执行之后,我不能让它工作?任何想法为什么?如果所有其他方法都失败了,我有什么办法可以编写 Hugs 脚本吗?

感谢您的任何帮助!

4

2 回答 2

4

您可以通过getArgs. 例如,听起来您想要一个执行以下操作的 main 函数:

>main = do
>    args <- getArgs
>    case args of
>        [] -> putStrLn "What file did you want me to compile?"
>        [filename] -> compile filename
>        _ -> putStrLn "I only compile one file at a time."

修改口味。

于 2012-06-12T20:27:14.093 回答
2

替换main

 main = getArgs >>= \(arg1:_) -> compile arg1

这将传递第一个命令行参数 ( arg1)compile而不是 "test",并忽略其余的 ( _)。您可能需要添加

 import System

或者

import System.Environment

我不记得为此拥抱需要什么。

于 2012-06-12T20:31:02.247 回答