查看Template Haskell生成的代码的首选方法

时间:2011-12-15 12:31:35

标签: haskell ghc pretty-print template-haskell

如您所知,Template Haskell用于在编译时以编程方式生成各种AST拼接。

然而,拼接通常可能非常不透明,并且通常很难辨别拼接实际生成的内容。如果为拼接运行Q monad,并且拼接良好,则可以获得生成的AST片段的show表示,但这种表示很难理解,因为它的非结构化布局。

将TH生成的AST转换为类似于普通Haskell代码的首选方法是什么,以便可以轻松读取和理解代码?可以从例如重构源代码重建源代码。给定的Dec值?是否必须阅读GHC核心代码?有没有办法至少构建AST以使其更具可读性(超出例如pretty-show包的作用)?

3 个答案:

答案 0 :(得分:52)

您是否在寻找编译器的-ddump-splices标志?

答案 1 :(得分:22)

您可以使用Language.Haskell.TH.Ppr中的pprintppr(使用Language.Haskell.TH自动导入):

GHCi> expr <- runQ [| \f g x -> f (x*2 + 3) . g |]
GHCi> putStrLn $ pprint expr
\f_0 g_1 x_2 -> f_0 ((x_2 GHC.Num.* 2) GHC.Num.+ 3) GHC.Base.. g_1

它不漂亮,但它 有效的Haskell。你应该能够通过从Prelude名称中删除模块前缀来使输出更好(尽管你可能需要小心只去掉预期的前缀;毕竟Foo.*是一个完全有效的中缀运算符)。

答案 2 :(得分:1)

作为ehird answer的补充:

请注意,直接从GHCi使用public class CardStack extends Stack<Card> { ... } 一般来说可能不起作用 (例如:使用runQ操作的TH生成器, 比照comments above the runQ declaration)。

如果失败,您可以reify(或pprint),转换字符串表达式show,然后拼接为stringE的参数:

putStrLn