如何将RTS选项传递给runghc?

Yos*_*osh 10 haskell ghc

因为ghci,我可以限制ghci可以使用的内存

$ ghci +RTS -M10m -RTS
Run Code Online (Sandbox Code Playgroud)

当我编译整个程序时,我可以

$ ghc -rtsopts a.hs 
Run Code Online (Sandbox Code Playgroud)

然后

$ ./a +RTS -M10m
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做runghc a.hs?我尝试了几种方法,runghc a.hs +RTS -M10m但似乎没有一种方法可行.我可以限制内存的唯一选择是

$ export GHCRTS='-M10m'
$ runghc a.hs
Run Code Online (Sandbox Code Playgroud)

,但我希望这只是一次,所以我更喜欢通过传递参数来做到这一点runghc.


编辑:我正在使用以下策略检查选项是否正常(仅仅因为我不知道更好的方法):

-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0
Run Code Online (Sandbox Code Playgroud)

打开两个终端,一个用于top命令,另一个用于执行代码.如果执行停止说"堆耗尽",我认为这-M[number]m是有效的.如果执行继续并使用大量内存,我会终止该过程并断定它没有成功.

Nei*_*hew 6

GHCRTS=... runghc ...chi所说的那样使用是唯一的方法。由于runghc解释其命令行的方式,+RTS被解释为runghc自身的RTS 选项(如果它在末尾)或作为程序名称(如果它在开头)。它永远不会到达运行时。您可以强制将其传递给程序使用,--RTS +RTS ...但随后将其视为程序参数,并且运行时仍然看不到它。

为了对此进行调查,我编写了一个包装 shell 脚本来ghc跟踪其参数,并将其runghc-f选项一起传递给。

创建一个ghc-wrapper包含以下内容的文件:

#!/bin/sh -x
exec ghc "$@"
Run Code Online (Sandbox Code Playgroud)

-x选项告诉/bin/sh跟踪每一行。使用它runghc

$ runghc -f ./ghc-wrapper Hello.hs
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs
Hello, World!

$ runghc -f ./ghc-wrapper Hello.hs +RTS -s
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs
Hello, World!
    114,016 bytes allocated in the heap # runghc's heap, not Hello's
    ...

$ runghc -f ./ghc-wrapper Hello.hs --RTS +RTS -s
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main ["+RTS","-s"] Hello.hs
Hello, World!

$ runghc -f ./ghc-wrapper -- +RTS -s -RTS Hello.hs
+ exec ghc -ignore-dot-ghci -e :set prog "+RTS" -e :main ["-s","-RTS","Hello.hs"] +RTS
+RTS:1:55:
    Not in scope: `main'
    Perhaps you meant `min' (imported from Prelude)
Run Code Online (Sandbox Code Playgroud)

我们真正想要runghc执行的是:

$ ghc -ignore-dot-ghci -x hs +RTS -s -RTS -e ':set prog "Hello.hs"' -e ':main []' Hello.hs
Hello, World!
      80,654,256 bytes allocated in the heap
      ...
Run Code Online (Sandbox Code Playgroud)

但是没有办法指定,因为runghc没有+RTS特殊对待。