Added bang patterns
authorManuel M T Chakravarty <chak@cse.unsw.edu.au>
Thu, 26 Mar 2009 10:07:06 +0000 (10:07 +0000)
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>
Thu, 26 Mar 2009 10:07:06 +0000 (10:07 +0000)
libraries/template-haskell/Language/Haskell/TH.hs
libraries/template-haskell/Language/Haskell/TH/Lib.hs
libraries/template-haskell/Language/Haskell/TH/Ppr.hs
libraries/template-haskell/Language/Haskell/TH/Syntax.hs

index 625e403..deca041 100644 (file)
@@ -31,7 +31,8 @@ module Language.Haskell.TH(
         InlineSpecQ,
        intPrimL, wordPrimL, floatPrimL, doublePrimL, integerL, rationalL,
        charL, stringL,
-       litP, varP, tupP, conP, infixP, tildeP, asP, wildP, recP, listP, sigP,
+       litP, varP, tupP, conP, infixP, tildeP, bangP, asP, wildP, recP,
+       listP, sigP, 
        fieldPat,
        bindS, letS, noBindS, parS, 
        fromR, fromThenR, fromToR, fromThenToR, 
index a45090b..9fd3856 100644 (file)
@@ -70,6 +70,9 @@ infixP p1 n p2 = do p1' <- p1
 tildeP :: PatQ -> PatQ
 tildeP p = do p' <- p
               return (TildeP p')
+bangP :: PatQ -> PatQ
+bangP p = do p' <- p
+             return (BangP p')
 asP :: Name -> PatQ -> PatQ
 asP n p = do p' <- p
              return (AsP n p')
@@ -518,6 +521,7 @@ rename (InfixP p1 n p2) = do { r1 <- rename p1;
                                let {(env, [p1', p2']) = combine [r1, r2]};
                                return (env, InfixP p1' n p2') }
 rename (TildeP p) = do { (env,p2) <- rename p; return(env,TildeP p2) }   
+rename (BangP p) = do { (env,p2) <- rename p; return(env,BangP p2) }   
 rename (AsP s p) = 
    do { s1 <- newName (nameBase s); (env,p2) <- rename p; return((s,s1):env,AsP s1 p2) }
 rename WildP = return([],WildP)
index a534fb7..c3b1170 100644 (file)
@@ -181,6 +181,7 @@ pprPat i (InfixP p1 n p2)
                                                pprName' Infix n <+>
                                                pprPat opPrec p2)
 pprPat i (TildeP p)   = parensIf (i > noPrec) $ char '~' <> pprPat appPrec p
+pprPat i (BangP p)    = parensIf (i > noPrec) $ char '!' <> pprPat appPrec p
 pprPat i (AsP v p)    = parensIf (i > noPrec) $ ppr v <> text "@"
                                                       <> pprPat appPrec p
 pprPat _ WildP        = text "_"
index 0b38572..3088a2c 100644 (file)
@@ -644,6 +644,7 @@ data Pat
   | ConP Name [Pat]               -- data T1 = C1 t1 t2; {C1 p1 p1} = e 
   | InfixP Pat Name Pat           -- foo ({x :+ y}) = e 
   | TildeP Pat                    -- { ~p }
+  | BangP Pat                     -- { !p }
   | AsP Name Pat                  -- { x @ p }
   | WildP                         -- { _ }
   | RecP Name [FieldPat]          -- f (Pt { pointx = x }) = g x