如您所知,Template Haskell用于在编译时以编程方式生成各种AST拼接。
然而,拼接通常可能非常不透明,并且通常很难辨别拼接实际生成的内容。如果为拼接运行Q
monad,并且拼接良好,则可以获得生成的AST片段的show
表示,但这种表示很难理解,因为它的非结构化布局。
将TH生成的AST转换为类似于普通Haskell代码的首选方法是什么,以便可以轻松读取和理解代码?可以从例如重构源代码重建源代码。给定的Dec
值?是否必须阅读GHC核心代码?有没有办法至少构建AST以使其更具可读性(超出例如pretty-show
包的作用)?
答案 0 :(得分:52)
您是否在寻找编译器的-ddump-splices
标志?
答案 1 :(得分:22)
您可以使用Language.Haskell.TH.Ppr中的pprint
或ppr
(使用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