2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1994
4 \section[HsExpr]{Abstract Haskell syntax: expressions}
7 #include "HsVersions.h"
12 IMPORT_DELOOPER(HsLoop) -- for paranoia checking
15 import HsBinds ( HsBinds )
16 import HsBasic ( HsLit, Fixity(..), FixityDirection(..) )
17 import HsMatches ( pprMatches, pprMatch, Match )
18 import HsTypes ( HsType )
21 import Id ( SYN_IE(DictVar), GenId, SYN_IE(Id) )
22 import Name ( pprNonSym, pprSym )
23 import Outputable ( interppSP, interpp'SP, ifnotPprForUser )
24 import PprType ( pprGenType, pprParendGenType, GenType{-instance-} )
26 import PprStyle ( PprStyle(..) )
27 import SrcLoc ( SrcLoc )
28 import Usage ( GenUsage{-instance-} )
29 --import Util ( panic{-ToDo:rm eventually-} )
32 %************************************************************************
34 \subsection{Expressions proper}
36 %************************************************************************
39 data HsExpr tyvar uvar id pat
40 = HsVar id -- variable
41 | HsLit HsLit -- literal
42 | HsLitOut HsLit -- TRANSLATION
43 (GenType tyvar uvar) -- (with its type)
45 | HsLam (Match tyvar uvar id pat) -- lambda
46 | HsApp (HsExpr tyvar uvar id pat) -- application
47 (HsExpr tyvar uvar id pat)
49 -- Operator applications:
50 -- NB Bracketed ops such as (+) come out as Vars.
52 -- NB We need an expr for the operator in an OpApp/Section since
53 -- the typechecker may need to apply the operator to a few types.
55 | OpApp (HsExpr tyvar uvar id pat) -- left operand
56 (HsExpr tyvar uvar id pat) -- operator
57 Fixity -- Renamer adds fixity; bottom until then
58 (HsExpr tyvar uvar id pat) -- right operand
60 -- We preserve prefix negation and parenthesis for the precedence parser.
61 -- They are eventually removed by the type checker.
63 | NegApp (HsExpr tyvar uvar id pat) -- negated expr
64 (HsExpr tyvar uvar id pat) -- the negate id (in a HsVar)
66 | HsPar (HsExpr tyvar uvar id pat) -- parenthesised expr
68 | SectionL (HsExpr tyvar uvar id pat) -- operand
69 (HsExpr tyvar uvar id pat) -- operator
70 | SectionR (HsExpr tyvar uvar id pat) -- operator
71 (HsExpr tyvar uvar id pat) -- operand
73 | HsCase (HsExpr tyvar uvar id pat)
74 [Match tyvar uvar id pat] -- must have at least one Match
77 | HsIf (HsExpr tyvar uvar id pat) -- predicate
78 (HsExpr tyvar uvar id pat) -- then part
79 (HsExpr tyvar uvar id pat) -- else part
82 | HsLet (HsBinds tyvar uvar id pat) -- let(rec)
83 (HsExpr tyvar uvar id pat)
86 [Stmt tyvar uvar id pat] -- "do":one or more stmts
89 | HsDoOut DoOrListComp
90 [Stmt tyvar uvar id pat] -- "do":one or more stmts
94 (GenType tyvar uvar) -- Type of the whole expression
97 | ExplicitList -- syntactic list
98 [HsExpr tyvar uvar id pat]
99 | ExplicitListOut -- TRANSLATION
100 (GenType tyvar uvar) -- Gives type of components of list
101 [HsExpr tyvar uvar id pat]
103 | ExplicitTuple -- tuple
104 [HsExpr tyvar uvar id pat]
105 -- NB: Unit is ExplicitTuple []
106 -- for tuples, we can get the types
107 -- direct from the components
109 -- Record construction
110 | RecordCon (HsExpr tyvar uvar id pat) -- Always (HsVar id) until type checker,
111 -- but the latter adds its type args too
112 (HsRecordBinds tyvar uvar id pat)
115 | RecordUpd (HsExpr tyvar uvar id pat)
116 (HsRecordBinds tyvar uvar id pat)
118 | RecordUpdOut (HsExpr tyvar uvar id pat) -- TRANSLATION
119 [id] -- Dicts needed for construction
120 (HsRecordBinds tyvar uvar id pat)
122 | ExprWithTySig -- signature binding
123 (HsExpr tyvar uvar id pat)
125 | ArithSeqIn -- arithmetic sequence
126 (ArithSeqInfo tyvar uvar id pat)
128 (HsExpr tyvar uvar id pat) -- (typechecked, of course)
129 (ArithSeqInfo tyvar uvar id pat)
131 | CCall FAST_STRING -- call into the C world; string is
132 [HsExpr tyvar uvar id pat] -- the C function; exprs are the
133 -- arguments to pass.
134 Bool -- True <=> might cause Haskell
135 -- garbage-collection (must generate
136 -- more paranoid code)
137 Bool -- True <=> it's really a "casm"
138 -- NOTE: this CCall is the *boxed*
139 -- version; the desugarer will convert
140 -- it into the unboxed "ccall#".
141 (GenType tyvar uvar) -- The result type; will be *bottom*
142 -- until the typechecker gets ahold of it
144 | HsSCC FAST_STRING -- "set cost centre" (_scc_) annotation
145 (HsExpr tyvar uvar id pat) -- expr whose cost is to be measured
148 Everything from here on appears only in typechecker output.
151 | TyLam -- TRANSLATION
153 (HsExpr tyvar uvar id pat)
154 | TyApp -- TRANSLATION
155 (HsExpr tyvar uvar id pat) -- generated by Spec
158 -- DictLam and DictApp are "inverses"
161 (HsExpr tyvar uvar id pat)
163 (HsExpr tyvar uvar id pat)
166 -- ClassDictLam and Dictionary are "inverses" (see note below)
168 [id] -- superclass dicts
170 (HsExpr tyvar uvar id pat)
172 [id] -- superclass dicts
175 | SingleDict -- a simple special case of Dictionary
176 id -- local dictionary name
178 type HsRecordBinds tyvar uvar id pat
179 = [(id, HsExpr tyvar uvar id pat, Bool)]
180 -- True <=> source code used "punning",
181 -- i.e. {op1, op2} rather than {op1=e1, op2=e2}
184 A @Dictionary@, unless of length 0 or 1, becomes a tuple. A
185 @ClassDictLam dictvars methods expr@ is, therefore:
187 \ x -> case x of ( dictvars-and-methods-tuple ) -> expr
191 instance (NamedThing id, Outputable id, Outputable pat,
192 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
193 Outputable (HsExpr tyvar uvar id pat) where
198 pprExpr sty (HsVar v) = ppr sty v
200 pprExpr sty (HsLit lit) = ppr sty lit
201 pprExpr sty (HsLitOut lit _) = ppr sty lit
203 pprExpr sty (HsLam match)
204 = ppCat [ppChar '\\', ppNest 2 (pprMatch sty True match)]
206 pprExpr sty expr@(HsApp e1 e2)
207 = let (fun, args) = collect_args expr [] in
208 ppHang (pprExpr sty fun) 4 (ppSep (map (pprExpr sty) args))
210 collect_args (HsApp fun arg) args = collect_args fun (arg:args)
211 collect_args fun args = (fun, args)
213 pprExpr sty (OpApp e1 op fixity e2)
215 HsVar v -> pp_infixly v
218 pp_e1 = pprParendExpr sty e1 -- Add parens to make precedence clear
219 pp_e2 = pprParendExpr sty e2
222 = ppHang (pprExpr sty op) 4 (ppSep [pp_e1, pp_e2])
225 = ppSep [pp_e1, ppCat [ppr sty v, pp_e2]]
227 pprExpr sty (NegApp e _)
228 = ppBeside (ppChar '-') (pprParendExpr sty e)
230 pprExpr sty (HsPar e)
231 = ppParens (pprExpr sty e)
233 pprExpr sty (SectionL expr op)
235 HsVar v -> pp_infixly v
238 pp_expr = pprParendExpr sty expr
240 pp_prefixly = ppHang (ppCat [ppStr " \\ x_ ->", ppr sty op])
241 4 (ppCat [pp_expr, ppPStr SLIT("x_ )")])
243 = ppSep [ ppBeside ppLparen pp_expr,
244 ppBeside (ppr sty v) ppRparen ]
246 pprExpr sty (SectionR op expr)
248 HsVar v -> pp_infixly v
251 pp_expr = pprParendExpr sty expr
253 pp_prefixly = ppHang (ppCat [ppStr "( \\ x_ ->", ppr sty op, ppPStr SLIT("x_")])
254 4 (ppBeside pp_expr ppRparen)
256 = ppSep [ ppBeside ppLparen (ppr sty v),
257 ppBeside pp_expr ppRparen ]
259 pprExpr sty (HsCase expr matches _)
260 = ppSep [ ppSep [ppPStr SLIT("case"), ppNest 4 (pprExpr sty expr), ppPStr SLIT("of")],
261 ppNest 2 (pprMatches sty (True, ppNil) matches) ]
263 pprExpr sty (HsIf e1 e2 e3 _)
264 = ppSep [ppCat [ppPStr SLIT("if"), ppNest 2 (pprExpr sty e1), ppPStr SLIT("then")],
265 ppNest 4 (pprExpr sty e2),
267 ppNest 4 (pprExpr sty e3)]
269 -- special case: let ... in let ...
270 pprExpr sty (HsLet binds expr@(HsLet _ _))
271 = ppSep [ppHang (ppPStr SLIT("let")) 2 (ppCat [ppr sty binds, ppPStr SLIT("in")]),
274 pprExpr sty (HsLet binds expr)
275 = ppSep [ppHang (ppPStr SLIT("let")) 2 (ppr sty binds),
276 ppHang (ppPStr SLIT("in")) 2 (ppr sty expr)]
278 pprExpr sty (HsDo do_or_list_comp stmts _) = pprDo do_or_list_comp sty stmts
279 pprExpr sty (HsDoOut do_or_list_comp stmts _ _ _ _ _) = pprDo do_or_list_comp sty stmts
281 pprExpr sty (ExplicitList exprs)
282 = ppBracket (ppInterleave ppComma (map (pprExpr sty) exprs))
283 pprExpr sty (ExplicitListOut ty exprs)
284 = ppBesides [ ppBracket (ppInterleave ppComma (map (pprExpr sty) exprs)),
285 ifnotPprForUser sty (ppBeside ppSP (ppParens (pprGenType sty ty))) ]
287 pprExpr sty (ExplicitTuple exprs)
288 = ppParens (ppInterleave ppComma (map (pprExpr sty) exprs))
290 pprExpr sty (RecordCon con rbinds)
291 = pp_rbinds sty (ppr sty con) rbinds
293 pprExpr sty (RecordUpd aexp rbinds)
294 = pp_rbinds sty (pprParendExpr sty aexp) rbinds
295 pprExpr sty (RecordUpdOut aexp _ rbinds)
296 = pp_rbinds sty (pprParendExpr sty aexp) rbinds
298 pprExpr sty (ExprWithTySig expr sig)
299 = ppHang (ppBeside (ppNest 2 (pprExpr sty expr)) (ppPStr SLIT(" ::")))
302 pprExpr sty (ArithSeqIn info)
303 = ppBracket (ppr sty info)
304 pprExpr sty (ArithSeqOut expr info)
307 ppBracket (ppr sty info)
309 ppBesides [ppLbrack, ppParens (ppr sty expr), ppSP, ppr sty info, ppRbrack]
311 pprExpr sty (CCall fun args _ is_asm result_ty)
313 then ppBesides [ppPStr SLIT("_casm_ ``"), ppPStr fun, ppPStr SLIT("''")]
314 else ppBeside (ppPStr SLIT("_ccall_ ")) (ppPStr fun))
315 4 (ppSep (map (pprParendExpr sty) args))
317 pprExpr sty (HsSCC label expr)
318 = ppSep [ ppBeside (ppPStr SLIT("_scc_ ")) (ppBesides [ppChar '"', ppPStr label, ppChar '"']),
319 pprParendExpr sty expr ]
321 pprExpr sty (TyLam tyvars expr)
322 = ppHang (ppCat [ppPStr SLIT("/\\"), interppSP sty tyvars, ppPStr SLIT("->")])
325 pprExpr sty (TyApp expr [ty])
326 = ppHang (pprExpr sty expr) 4 (pprParendGenType sty ty)
328 pprExpr sty (TyApp expr tys)
329 = ppHang (pprExpr sty expr)
330 4 (ppBracket (interpp'SP sty tys))
332 pprExpr sty (DictLam dictvars expr)
333 = ppHang (ppCat [ppPStr SLIT("\\{-dict-}"), interppSP sty dictvars, ppPStr SLIT("->")])
336 pprExpr sty (DictApp expr [dname])
337 = ppHang (pprExpr sty expr) 4 (ppr sty dname)
339 pprExpr sty (DictApp expr dnames)
340 = ppHang (pprExpr sty expr)
341 4 (ppBracket (interpp'SP sty dnames))
343 pprExpr sty (ClassDictLam dicts methods expr)
344 = ppHang (ppCat [ppPStr SLIT("\\{-classdict-}"),
345 ppBracket (interppSP sty dicts),
346 ppBracket (interppSP sty methods),
350 pprExpr sty (Dictionary dicts methods)
351 = ppSep [ppBesides [ppLparen, ppPStr SLIT("{-dict-}")],
352 ppBracket (interpp'SP sty dicts),
353 ppBesides [ppBracket (interpp'SP sty methods), ppRparen]]
355 pprExpr sty (SingleDict dname)
356 = ppCat [ppPStr SLIT("{-singleDict-}"), ppr sty dname]
360 Parenthesize unless very simple:
362 pprParendExpr :: (NamedThing id, Outputable id, Outputable pat,
363 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
364 => PprStyle -> HsExpr tyvar uvar id pat -> Pretty
366 pprParendExpr sty expr
368 pp_as_was = pprExpr sty expr
372 HsLitOut l _ -> ppr sty l
375 ExplicitList _ -> pp_as_was
376 ExplicitListOut _ _ -> pp_as_was
377 ExplicitTuple _ -> pp_as_was
380 _ -> ppParens pp_as_was
383 %************************************************************************
385 \subsection{Record binds}
387 %************************************************************************
390 pp_rbinds :: (NamedThing id, Outputable id, Outputable pat,
391 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
392 => PprStyle -> Pretty
393 -> HsRecordBinds tyvar uvar id pat -> Pretty
395 pp_rbinds sty thing rbinds
397 4 (ppCurlies (ppIntersperse pp'SP (map (pp_rbind sty) rbinds)))
399 pp_rbind PprForUser (v, _, True) = ppr PprForUser v
400 pp_rbind sty (v, e, _) = ppCat [ppr sty v, ppChar '=', ppr sty e]
403 %************************************************************************
405 \subsection{Do stmts and list comprehensions}
407 %************************************************************************
410 data DoOrListComp = DoStmt | ListComp
412 pprDo DoStmt sty stmts
413 = ppHang (ppPStr SLIT("do")) 2 (ppAboves (map (ppr sty) stmts))
414 pprDo ListComp sty stmts
415 = ppHang (ppCat [ppLbrack, pprExpr sty expr, ppChar '|'])
416 4 (ppSep [interpp'SP sty quals, ppRbrack])
418 ReturnStmt expr = last stmts -- Last stmt should be a ReturnStmt for list comps
423 data Stmt tyvar uvar id pat
425 (HsExpr tyvar uvar id pat)
428 | LetStmt (HsBinds tyvar uvar id pat)
430 | GuardStmt (HsExpr tyvar uvar id pat) -- List comps only
433 | ExprStmt (HsExpr tyvar uvar id pat) -- Do stmts only
436 | ReturnStmt (HsExpr tyvar uvar id pat) -- List comps only, at the end
440 instance (NamedThing id, Outputable id, Outputable pat,
441 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
442 Outputable (Stmt tyvar uvar id pat) where
443 ppr sty (BindStmt pat expr _)
444 = ppCat [ppr sty pat, ppPStr SLIT("<-"), ppr sty expr]
445 ppr sty (LetStmt binds)
446 = ppCat [ppPStr SLIT("let"), ppr sty binds]
447 ppr sty (ExprStmt expr _)
449 ppr sty (GuardStmt expr _)
451 ppr sty (ReturnStmt expr)
452 = ppCat [ppPStr SLIT("return"), ppr sty expr]
455 %************************************************************************
457 \subsection{Enumerations and list comprehensions}
459 %************************************************************************
462 data ArithSeqInfo tyvar uvar id pat
463 = From (HsExpr tyvar uvar id pat)
464 | FromThen (HsExpr tyvar uvar id pat)
465 (HsExpr tyvar uvar id pat)
466 | FromTo (HsExpr tyvar uvar id pat)
467 (HsExpr tyvar uvar id pat)
468 | FromThenTo (HsExpr tyvar uvar id pat)
469 (HsExpr tyvar uvar id pat)
470 (HsExpr tyvar uvar id pat)
474 instance (NamedThing id, Outputable id, Outputable pat,
475 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
476 Outputable (ArithSeqInfo tyvar uvar id pat) where
477 ppr sty (From e1) = ppBesides [ppr sty e1, pp_dotdot]
478 ppr sty (FromThen e1 e2) = ppBesides [ppr sty e1, pp'SP, ppr sty e2, pp_dotdot]
479 ppr sty (FromTo e1 e3) = ppBesides [ppr sty e1, pp_dotdot, ppr sty e3]
480 ppr sty (FromThenTo e1 e2 e3)
481 = ppBesides [ppr sty e1, pp'SP, ppr sty e2, pp_dotdot, ppr sty e3]
483 pp_dotdot = ppPStr SLIT(" .. ")