这有点长,所以请耐心等待!
我在使用Haskell程序时遇到了一些麻烦,我必须将其用作uni项目的一部分。作为参考,它是Casper。
所以,你应该执行一个脚本,这实际上是一个Bash脚本来调用这样的Hugs解释器:
exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES
$ FILES指向Main.lhs文件。
在此之后,我需要在解释器中调用带有文件路径的函数“compile”。
我需要以脚本方式执行上述操作。我需要这个自动化,因为我正在编写一个程序,它将在后台调用Casper。
所以我编译了.lhs文件。现在我想执行“编译”功能,但我不知道如何完成。我试试:
./Main compile <a path>
从命令行但它返回一个关于未找到文件“test”的错误。经过调查,我在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的脚本?
感谢您的帮助!
答案 0 :(得分:4)
您可以通过getArgs
访问传递给Haskell程序的命令行参数。例如,听起来你想要一个像这样做的主函数:
>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."
修改品味。
答案 1 :(得分:2)
将main
替换为
main = getArgs >>= \(arg1:_) -> compile arg1
这会将第一个命令行参数(arg1
)传递给compile
而不是“test”,并忽略其余部分(_
)。您可能需要添加
import System
或
import System.Environment
我不记得拥抱这需要什么。