8

我在 haskell 中编写了一个脚本,命名testscript为以下代码:

#!/usr/bin/env runhaskell

main = putStrLn "hello"

使脚本可执行后,我可以使用./testscript. 但是,当我尝试使用 ghci(即使用:l testscript)加载脚本时,出现错误

target `testscript' is not a module name or a source file

如果我重命名testscripttestscript.hs,并尝试再次使用 ghci 加载,我会收到错误消息

testscript.hs:1:0:  error: invalid preprocessing directive #!
phase `C pre-processor' failed (exitcode = 1)

如果我删除 shebang 线,它可以正常工作。但是,每次我想在 ghci 中尝试脚本时,都必须.hs向脚本添加扩展名,删除第一行,然后删除扩展名并添加 shebang 行(这在我每次想要进行更改时都很常见).hs给它)。有没有更简单的方法来做到这一点?

我在 Mac OS X 10.6.8 下使用 ghc 版本 7.0.3

4

1 回答 1

12

您可以使用该-x选项告诉 GHCi(或 GHC)将所有后续文件视为具有指定扩展名。

似乎没有任何方法可以从 GHCi 中指定此选项(用于与 一起使用:load),但是如果您想要创建一个带有.hs扩展名的符号链接并加载它,您可以使用一种解决方法。

shebang 行的第二个问题是由于某种原因在源文件上运行 C 预处理器引起的(我在 Ubuntu 上安装的旧 GHC 没有这样做)。您可以使用该-XNoCPP选项禁用此功能。

因此,对于您的情况,这应该从命令行工作:

ghci -x hs -XNoCPP testscript
于 2011-11-18T05:28:34.827 回答