2012-08-28 21 views
4

我已经编写了一个小工具来扩展Haskell模块中的所有TH接头,这样即使TH不可用,我也可以使用haskell模块。为此,我在编译模块并捕获结果代码时将-ddump-splices选项传递给GHC,然后用捕获的代码替换模块中的TH声明。我可以依靠模板Haskell扩展(使用-ddump-splices)来始终生成有效的代码吗?

但是,它看起来像-ddump-splices并不总是生成可编译的代码。具体来说,它似乎使用大括号的布局,但没有在正确的地方添加分号!

这里是我的测试文件的例子 -

case dispatch_a3Tg pieces0_a3Tf of { 
    Just f_a3U6 
     -> f_a3U6 
      master0_a3T9 
      sub0_a3Ta 
      toMaster0_a3Tb 
      app4040_a3Tc 
      handler4050_a3Td 
      method0_a3Te 
    Nothing -> app4040_a3Tc } 

这产生的打开和关闭括号而不是两个案件之间的替代品所需要的分号。这会导致下面的错误在编译时 -

GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (Test.hs, interpreted) 

Test.hs:51:17: parse error on input `->' 
Failed, modules loaded: none. 
Prelude> 

回答

3

没有,拼接转储往往无效代码,它需要显著的时间来减少这些东西,不仅编译,但人是可以理解的。当调查TYB的方面时,这是一个令人沮丧的来源。

+2

什么是TYB? Temecula青年棒球? –

+0

我在编辑中添加了一个链接,并且很想尝试使用{[h](http://www.haskell.org/hoogle/?hoogle=tyb),[g](https:// www .google.com /查询q =哈斯克尔+ TYB)} oogle。这并不是一个糟糕的问题,只是指出在Haskell Sun下hoogle是多么有用是一种习惯。 –

+1

GHC功能请求:http://hackage.haskell.org/trac/ghc/ticket/5016。这是不太可能在不久的将来修复。 – sdcvvc