GHC -ddump-splices选项——模板Haskell

19
我正在遵循Yesod书中的内容,其中提到:
但是通过使用 -ddump-splices GHC选项,我们可以立即查看生成的代码。一个更加清晰的版本如下:
我该怎么做呢?我尝试使用 ghc -XTemplateHaskell -ddump-splices Page.hs 编译我的文件,但是目录如下所示:
Page Page.hi Page.hs Page.hs~ Page.o
然而,这些文件中都没有包含由Template Haskell生成的中间代码。

http://www.yesodweb.com/book/basics


1
我是一个完全的新手 - 这个命令应该怎么用?如果我按照你写的方式运行ghc(使用helloworld.hs),我会得到“找不到模块‘Yesod’”的错误。我只能使用stack runghc helloworld.hs来编译/运行。 - User
2个回答

17

同时,行为发生了改变,除了-ddump-splices标志外,还可以使用-ddump-to-file标志将splice写入文件。更多详细信息请参见当前文档(GHC 8.2.1)的第9.26节


在较旧版本的GHC上(我没有检查确切是哪个版本发生了更改),-ddump-splices的工作方式不同:

-ddump-splices选项会导致GHC将splice转储到stderr。不幸的是,-ddump-to-file标志对splice没有影响(我不知道这是否有更深层次的原因或仅是疏忽),因此您需要捕获stderr输出以保存splice以供以后调查。

ghc -XTemplateHaskell -ddump-splices Page.hs 2> Page.dump-splices

在类似Bash的shell中。


1
谢谢。为什么它输出到stderr而不是stdout? - Matthew H
3
我不知道。可能有原因,也可能是历史偶然性。您可能需要询问总部以获得答案。 - Daniel Fischer
1
根据 https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/template-haskell.html 的说法,这个已经在中途被更改了。它声称默认情况下会转储到标准输出,而 -ddump-to-file 应该会将其转储到 .dump-splices 文件中。 - robx
@robx 感谢提醒,正在更新答案。 - Daniel Fischer

4
在大型项目中,对所有模块执行此操作有问题。幸运的是,您可以为每个模块进行转储。这在ghci中也适用。
您可以将此行添加到模块的顶部。
{-# OPTIONS_GHC -ddump-splices #-}

它会将其转储到标准错误流(stderr)。


{-# OPTIONS_GHC -ddump-to-file #-}

这也很有用,可以将转储放在带前缀.dump-simpl的模块旁边的文件中。

参考文献:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/debugging.html#ghc-flag--ddump-to-file

https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/debugging.html#ghc-flag--ddump-splices

您可以将它们作为单独的行添加(以便轻松复制粘贴)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接