X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FhsSyn%2FHsExpr.lhs;h=78577072efb9c8982082bbf2bc79af73ea513727;hb=edc0bafd3fcd01b85a2e8894e5dfe149eb0e0857;hp=245631d789680d8cf873d97b567f66db29e32afe;hpb=d2ce0f52d42edf32bb9f13796e6ba6edba8bd516;p=ghc-hetmet.git diff --git a/compiler/hsSyn/HsExpr.lhs b/compiler/hsSyn/HsExpr.lhs index 245631d..7857707 100644 --- a/compiler/hsSyn/HsExpr.lhs +++ b/compiler/hsSyn/HsExpr.lhs @@ -132,7 +132,10 @@ data HsExpr id | HsCase (LHsExpr id) (MatchGroup id) - | HsIf (LHsExpr id) -- predicate + | HsIf (Maybe (SyntaxExpr id)) -- cond function + -- Nothing => use the built-in 'if' + -- See Note [Rebindable if] + (LHsExpr id) -- predicate (LHsExpr id) -- then part (LHsExpr id) -- else part @@ -297,11 +300,18 @@ type PendingSplice = (Name, LHsExpr Id) -- Typechecked splices, waiting to be -- pasted back in by the desugarer \end{code} -A @Dictionary@, unless of length 0 or 1, becomes a tuple. A -@ClassDictLam dictvars methods expr@ is, therefore: -\begin{verbatim} -\ x -> case x of ( dictvars-and-methods-tuple ) -> expr -\end{verbatim} +Note [Rebindable if] +~~~~~~~~~~~~~~~~~~~~ +The rebindable syntax for 'if' is a bit special, because when +rebindable syntax is *off* we do not want to treat + (if c then t else e) +as if it was an application (ifThenElse c t e). Why not? +Because we allow an 'if' to return *unboxed* results, thus + if blah then 3# else 4# +whereas that would not be possible using a all to a polymorphic function +(because you can't call a polymorphic function at an unboxed type). + +So we use Nothing to mean "use the old built-in typing rule". \begin{code} instance OutputableBndr id => Outputable (HsExpr id) where @@ -414,7 +424,7 @@ ppr_expr exprType@(HsCase expr matches) nest 2 (pprMatches (CaseAlt `asTypeOf` idType exprType) matches <+> char '}') ] where idType :: HsExpr id -> HsMatchContext id; idType = undefined -ppr_expr (HsIf e1 e2 e3) +ppr_expr (HsIf _ e1 e2 e3) = sep [hsep [ptext (sLit "if"), nest 2 (ppr e1), ptext (sLit "then")], nest 4 (ppr e2), ptext (sLit "else"), @@ -619,7 +629,8 @@ The legal constructors for commands are: [Match id] -- bodies are HsCmd's SrcLoc - | HsIf (HsExpr id) -- predicate + | HsIf (Maybe (SyntaxExpr id)) -- cond function + (HsExpr id) -- predicate (HsCmd id) -- then part (HsCmd id) -- else part SrcLoc @@ -748,16 +759,16 @@ pprFunBind fun inf matches = pprMatches (FunRhs fun inf) matches pprPatBind :: (OutputableBndr bndr, OutputableBndr id) => LPat bndr -> GRHSs id -> SDoc pprPatBind pat ty@(grhss) - = sep [ppr pat, nest 4 (pprGRHSs (PatBindRhs `asTypeOf` idType ty) grhss)] + = sep [ppr pat, nest 2 (pprGRHSs (PatBindRhs `asTypeOf` idType ty) grhss)] --avoid using PatternSignatures for stage1 code portability where idType :: GRHSs id -> HsMatchContext id; idType = undefined pprMatch :: (OutputableBndr idL, OutputableBndr idR) => HsMatchContext idL -> Match idR -> SDoc pprMatch ctxt (Match pats maybe_ty grhss) - = herald <+> sep [sep (map pprParendLPat other_pats), - ppr_maybe_ty, - nest 2 (pprGRHSs ctxt grhss)] + = sep [ sep (herald : map (nest 2 . pprParendLPat) other_pats) + , nest 2 ppr_maybe_ty + , nest 2 (pprGRHSs ctxt grhss) ] where (herald, other_pats) = case ctxt of @@ -997,8 +1008,8 @@ pprStmt (ExprStmt expr _ _) = ppr expr pprStmt (ParStmt stmtss) = hsep (map doStmts stmtss) where doStmts stmts = ptext (sLit "| ") <> ppr stmts -pprStmt (TransformStmt stmts _ using by) - = sep (ppr_lc_stmts stmts ++ [pprTransformStmt using by]) +pprStmt (TransformStmt stmts bndrs using by) + = sep (ppr_lc_stmts stmts ++ [pprTransformStmt bndrs using by]) pprStmt (GroupStmt stmts _ by using) = sep (ppr_lc_stmts stmts ++ [pprGroupStmt by using]) @@ -1010,8 +1021,11 @@ pprStmt (RecStmt { recS_stmts = segment, recS_rec_ids = rec_ids , ifPprDebug (vcat [ ptext (sLit "rec_ids=") <> ppr rec_ids , ptext (sLit "later_ids=") <> ppr later_ids])] -pprTransformStmt :: OutputableBndr id => LHsExpr id -> Maybe (LHsExpr id) -> SDoc -pprTransformStmt using by = sep [ ptext (sLit "then"), nest 2 (ppr using), nest 2 (pprBy by)] +pprTransformStmt :: OutputableBndr id => [id] -> LHsExpr id -> Maybe (LHsExpr id) -> SDoc +pprTransformStmt bndrs using by + = sep [ ptext (sLit "then") <+> ifPprDebug (braces (ppr bndrs)) + , nest 2 (ppr using) + , nest 2 (pprBy by)] pprGroupStmt :: OutputableBndr id => Maybe (LHsExpr id) -> Either (LHsExpr id) (SyntaxExpr is) @@ -1277,7 +1291,7 @@ pprStmtInCtxt ctxt stmt = hang (ptext (sLit "In a stmt of") <+> pprStmtContext c 4 (ppr_stmt stmt) where -- For Group and Transform Stmts, don't print the nested stmts! - ppr_stmt (GroupStmt _ _ by using) = pprGroupStmt by using - ppr_stmt (TransformStmt _ _ using by) = pprTransformStmt using by - ppr_stmt stmt = pprStmt stmt + ppr_stmt (GroupStmt _ _ by using) = pprGroupStmt by using + ppr_stmt (TransformStmt _ bndrs using by) = pprTransformStmt bndrs using by + ppr_stmt stmt = pprStmt stmt \end{code}