gpt4 book ai didi

haskell - 如何将 RTS 选项传递给 runghc?

转载 作者:行者123 更新时间:2023-12-03 15:15:13 28 4
gpt4 key购买 nike

对于 ghci ,我可以限制 ghci 可以使用的内存

$ ghci +RTS -M10m -RTS

当我编译整个程序时,我可以
$ ghc -rtsopts a.hs 

然后
$ ./a +RTS -M10m

我该如何为 runghc a.hs 执行此操作?我尝试了几种方法,例如 runghc a.hs +RTS -M10m ,但它们似乎都不起作用。我可以限制内存的唯一选择是
$ export GHCRTS='-M10m'
$ runghc a.hs

,但我希望这只是一次,所以我更喜欢通过将参数传递给 runghc .

编辑:我正在使用以下策略检查该选项是否有效(只是因为我不知道更好的方法):
-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0

打开两个终端,一个用于 top命令和另一个用于执行代码。如果执行停止说“堆用尽”,我得出结论 -M[number]m正在工作中。如果执行继续并使用大量内存,我将终止该进程并得出结论它没有成功。

最佳答案

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

为了调查这个问题,我为 ghc 编写了一个包装 shell 脚本。跟踪其参数,并将其传递给 runghc-f选项。

创建文件ghc-wrapper包含:

#!/bin/sh -x
exec ghc "$@"
-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)

我们真正想要的 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
...

但是没有办法指定,因为 runghc不处理 +RTS特别。

关于haskell - 如何将 RTS 选项传递给 runghc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29339643/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com