Ticket #5877: th.patch

File th.patch, 3.0 KB (added by reinerp, 16 months ago)

Patch for Template Haskell

  • Language/Haskell/TH/Lib.hs

    From 014a8b3a9a670699f6fc8f1b2196154530d6890a Mon Sep 17 00:00:00 2001
    From: Reiner Pope <reiner.pope@gmail.com>
    Date: Thu, 16 Feb 2012 10:58:28 +1100
    Subject: [PATCH] StringPrimL now takes [Word8]
    
    ---
     Language/Haskell/TH/Lib.hs    |    3 ++-
     Language/Haskell/TH/Ppr.hs    |    8 ++++++--
     Language/Haskell/TH/Syntax.hs |    3 ++-
     3 files changed, 10 insertions(+), 4 deletions(-)
    
    diff --git a/Language/Haskell/TH/Lib.hs b/Language/Haskell/TH/Lib.hs
    index 92f3dd4..8154fa6 100644
    a b  
    99 
    1010import Language.Haskell.TH.Syntax 
    1111import Control.Monad( liftM, liftM2 ) 
     12import Data.Word( Word8 ) 
    1213 
    1314---------------------------------------------------------- 
    1415-- * Type synonyms 
     
    5354charL       = CharL 
    5455stringL     :: String -> Lit 
    5556stringL     = StringL 
    56 stringPrimL :: String -> Lit 
     57stringPrimL :: [Word8] -> Lit 
    5758stringPrimL = StringPrimL 
    5859rationalL   :: Rational -> Lit 
    5960rationalL   = RationalL 
  • Language/Haskell/TH/Ppr.hs

    diff --git a/Language/Haskell/TH/Ppr.hs b/Language/Haskell/TH/Ppr.hs
    index 53f43ff..d3d5a1a 100644
    a b  
    99import Text.PrettyPrint (render) 
    1010import Language.Haskell.TH.PprLib 
    1111import Language.Haskell.TH.Syntax 
    12 import Data.Char ( toLower ) 
     12import Data.Word ( Word8 ) 
     13import Data.Char ( toLower, chr ) 
    1314import GHC.Show  ( showMultiLineString ) 
    1415 
    1516nestDepth :: Int 
     
    173174pprLit i (IntegerL x)    = parensIf (i > noPrec && x < 0) (integer x) 
    174175pprLit _ (CharL c)       = text (show c) 
    175176pprLit _ (StringL s)     = pprString s 
    176 pprLit _ (StringPrimL s) = pprString s <> char '#' 
     177pprLit _ (StringPrimL s) = pprString (bytesToString s) <> char '#' 
    177178pprLit i (RationalL rat) = parensIf (i > noPrec) $ rational rat 
    178179 
     180bytesToString :: [Word8] -> String 
     181bytesToString = map (chr . fromIntegral) 
     182 
    179183pprString :: String -> Doc 
    180184-- Print newlines as newlines with Haskell string escape notation,  
    181185-- not as '\n'.  For other non-printables use regular escape notation. 
  • Language/Haskell/TH/Syntax.hs

    diff --git a/Language/Haskell/TH/Syntax.hs b/Language/Haskell/TH/Syntax.hs
    index 9c464cf..25909e6 100644
    a b  
    6565import Control.Monad (liftM) 
    6666import System.IO        ( hPutStrLn, stderr ) 
    6767import Data.Char        ( isAlpha ) 
     68import Data.Word        ( Word8 ) 
    6869 
    6970----------------------------------------------------- 
    7071-- 
     
    791792         | WordPrimL Integer 
    792793         | FloatPrimL Rational 
    793794         | DoublePrimL Rational 
    794          | StringPrimL String   -- ^ A primitive C-style string, type Addr# 
     795         | StringPrimL [Word8]  -- ^ A primitive C-style string, type Addr# 
    795796    deriving( Show, Eq, Data, Typeable ) 
    796797 
    797798    -- We could add Int, Float, Double etc, as we do in HsLit,