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

dfl*_*str 40 haskell pretty-print ghc template-haskell

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

然而,拼接通常可能非常不透明,并且通常难以辨别拼接实际生成的内容.如果你运行Qmonad进行拼接,并且拼接是良好类型的,你可以很好地show表示生成的AST片段,但由于其非结构化布局,这种表示很难理解.

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

aug*_*tss 52

你在寻找-ddump-splices编译器的标志吗?

  • 是的,这种输出正是我正在寻找的!但是,如果只给出语法树,这可以在一个程序中完成,还是需要调用编译器呢? (2认同)
  • 注意:在运行此命令之前,请确保删除 .hi 和 .o 文件以获得干净的构建,否则您将不会获得任何 stderr 输出。 (2认同)

ehi*_*ird 22

您可以使用pprintpprLanguage.Haskell.TH.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
Run Code Online (Sandbox Code Playgroud)

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