X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FhsSyn%2FHsExpr.lhs;h=66336b628c25af521458bad558fce9603be04f78;hb=283e858564bb7979e59dcf00e852c2039aff231c;hp=e5d85ca08e58d801b62b44e2f4a8312fbb8d6a98;hpb=f098cfb236c17bcb3c46e39f9b1d7d8d8ca86003;p=ghc-hetmet.git diff --git a/compiler/hsSyn/HsExpr.lhs b/compiler/hsSyn/HsExpr.lhs index e5d85ca..66336b6 100644 --- a/compiler/hsSyn/HsExpr.lhs +++ b/compiler/hsSyn/HsExpr.lhs @@ -2,10 +2,9 @@ % (c) The University of Glasgow 2006 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % - -HsExpr: Abstract Haskell syntax: expressions - \begin{code} + +-- | Abstract Haskell syntax for expressions. module HsExpr where #include "HsVersions.h" @@ -35,14 +34,16 @@ import FastString %************************************************************************ \begin{code} +-- * Expressions proper + type LHsExpr id = Located (HsExpr id) ------------------------- --- PostTcExpr is an evidence expression attached to the --- syntax tree by the type checker (c.f. postTcType) --- We use a PostTcTable where there are a bunch of pieces of --- evidence, more than is convenient to keep individually +-- | PostTcExpr is an evidence expression attached to the syntax tree by the +-- type checker (c.f. postTcType). type PostTcExpr = HsExpr Id +-- | We use a PostTcTable where there are a bunch of pieces of evidence, more +-- than is convenient to keep individually. type PostTcTable = [(Name, Id)] noPostTcExpr :: PostTcExpr @@ -52,11 +53,12 @@ noPostTcTable :: PostTcTable noPostTcTable = [] ------------------------- --- SyntaxExpr is like PostTcExpr, but it's filled in a little earlier, +-- | SyntaxExpr is like 'PostTcExpr', but it's filled in a little earlier, -- by the renamer. It's used for rebindable syntax. --- E.g. (>>=) is filled in before the renamer by the appropriate Name --- for (>>=), and then instantiated by the type checker with its --- type args tec +-- +-- E.g. @(>>=)@ is filled in before the renamer by the appropriate 'Name' for +-- @(>>=)@, and then instantiated by the type checker with its type args +-- tec type SyntaxExpr id = HsExpr id @@ -66,29 +68,33 @@ noSyntaxExpr = HsLit (HsString (fsLit "noSyntaxExpr")) type SyntaxTable id = [(Name, SyntaxExpr id)] --- *** Currently used only for CmdTop (sigh) *** --- * Before the renamer, this list is noSyntaxTable +-- ^ Currently used only for 'CmdTop' (sigh) -- --- * After the renamer, it takes the form [(std_name, HsVar actual_name)] +-- * Before the renamer, this list is 'noSyntaxTable' +-- +-- * After the renamer, it takes the form @[(std_name, HsVar actual_name)]@ -- For example, for the 'return' op of a monad --- normal case: (GHC.Base.return, HsVar GHC.Base.return) --- with rebindable syntax: (GHC.Base.return, return_22) --- where return_22 is whatever "return" is in scope -- --- * After the type checker, it takes the form [(std_name, )] --- where is the evidence for the method +-- * normal case: @(GHC.Base.return, HsVar GHC.Base.return)@ +-- +-- * with rebindable syntax: @(GHC.Base.return, return_22)@ +-- where @return_22@ is whatever @return@ is in scope +-- +-- * After the type checker, it takes the form @[(std_name, )]@ +-- where @@ is the evidence for the method noSyntaxTable :: SyntaxTable id noSyntaxTable = [] ------------------------- +-- | A Haskell expression. data HsExpr id - = HsVar id -- variable - | HsIPVar (IPName id) -- implicit parameter - | HsOverLit (HsOverLit id) -- Overloaded literals + = HsVar id -- ^ variable + | HsIPVar (IPName id) -- ^ implicit parameter + | HsOverLit (HsOverLit id) -- ^ Overloaded literals - | HsLit HsLit -- Simple (non-overloaded) literals + | HsLit HsLit -- ^ Simple (non-overloaded) literals | HsLam (MatchGroup id) -- Currently always a single match @@ -158,6 +164,8 @@ data HsExpr id -- Record update | RecordUpd (LHsExpr id) (HsRecordBinds id) +-- (HsMatchGroup Id) -- Filled in by the type checker to be +-- -- a match that does the job [DataCon] -- Filled in by the type checker to the -- _non-empty_ list of DataCons that have -- all the upd'd fields @@ -378,8 +386,8 @@ ppr_expr exprType@(HsLam matches) where idType :: HsExpr id -> HsMatchContext id; idType = undefined ppr_expr exprType@(HsCase expr matches) - = sep [ sep [ptext (sLit "case"), nest 4 (ppr expr), ptext (sLit "of")], - nest 2 (pprMatches (CaseAlt `asTypeOf` idType exprType) matches) ] + = sep [ sep [ptext (sLit "case"), nest 4 (ppr expr), ptext (sLit "of {")], + nest 2 (pprMatches (CaseAlt `asTypeOf` idType exprType) matches <+> char '}') ] where idType :: HsExpr id -> HsMatchContext id; idType = undefined ppr_expr (HsIf e1 e2 e3) @@ -663,9 +671,12 @@ data Match id -- Nothing after typechecking (GRHSs id) +isEmptyMatchGroup :: MatchGroup id -> Bool +isEmptyMatchGroup (MatchGroup ms _) = null ms + matchGroupArity :: MatchGroup id -> Arity matchGroupArity (MatchGroup [] _) - = panic "matchGroupArity" -- MatchGroup is never empty + = panic "matchGroupArity" -- Precondition: MatchGroup is non-empty matchGroupArity (MatchGroup (match:matches) _) = ASSERT( all ((== n_pats) . length . hsLMatchPats) matches ) -- Assertion just checks that all the matches have the same number of pats @@ -676,13 +687,16 @@ matchGroupArity (MatchGroup (match:matches) _) hsLMatchPats :: LMatch id -> [LPat id] hsLMatchPats (L _ (Match pats _ _)) = pats --- GRHSs are used both for pattern bindings and for Matches +-- | GRHSs are used both for pattern bindings and for Matches data GRHSs id - = GRHSs [LGRHS id] -- Guarded RHSs - (HsLocalBinds id) -- The where clause + = GRHSs { + grhssGRHSs :: [LGRHS id], -- ^ Guarded RHSs + grhssLocalBinds :: (HsLocalBinds id) -- ^ The where clause + } type LGRHS id = Located (GRHS id) +-- | Guarded Right Hand Side. data GRHS id = GRHS [LStmt id] -- Guards (LHsExpr id) -- Right hand side \end{code} @@ -1006,10 +1020,10 @@ pp_dotdot = ptext (sLit " .. ") \begin{code} data HsMatchContext id -- Context of a Match = FunRhs id Bool -- Function binding for f; True <=> written infix - | CaseAlt -- Guard on a case alternative - | LambdaExpr -- Pattern of a lambda - | ProcExpr -- Pattern of a proc - | PatBindRhs -- Pattern binding + | CaseAlt -- Patterns and guards on a case alternative + | LambdaExpr -- Patterns of a lambda + | ProcExpr -- Patterns of a proc + | PatBindRhs -- Patterns in the *guards* of a pattern binding | RecUpd -- Record update [used only in DsExpr to -- tell matchWrapper what sort of -- runtime error message to generate]