2012-08-28 45 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