2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1994
4 \section[HsExpr]{Abstract Haskell syntax: expressions}
7 #include "HsVersions.h"
14 IMPORT_DELOOPER(HsLoop) ( pprMatches, pprMatch, Match )
15 import HsBinds ( HsBinds )
16 import HsBasic ( HsLit )
17 import BasicTypes ( Fixity(..), FixityDirection(..) )
18 import HsTypes ( HsType )
21 import Id ( SYN_IE(DictVar), GenId, SYN_IE(Id) )
22 import Outputable ( pprQuote, interppSP, interpp'SP, ifnotPprForUser,
23 PprStyle(..), userStyle, Outputable(..) )
24 import PprType ( pprGenType, pprParendGenType, GenType{-instance-} )
26 import SrcLoc ( SrcLoc )
27 import Usage ( GenUsage{-instance-} )
28 --import Util ( panic{-ToDo:rm eventually-} )
29 #if __GLASGOW_HASKELL__ >= 202
34 %************************************************************************
36 \subsection{Expressions proper}
38 %************************************************************************
41 data HsExpr tyvar uvar id pat
42 = HsVar id -- variable
43 | HsLit HsLit -- literal
44 | HsLitOut HsLit -- TRANSLATION
45 (GenType tyvar uvar) -- (with its type)
47 | HsLam (Match tyvar uvar id pat) -- lambda
48 | HsApp (HsExpr tyvar uvar id pat) -- application
49 (HsExpr tyvar uvar id pat)
51 -- Operator applications:
52 -- NB Bracketed ops such as (+) come out as Vars.
54 -- NB We need an expr for the operator in an OpApp/Section since
55 -- the typechecker may need to apply the operator to a few types.
57 | OpApp (HsExpr tyvar uvar id pat) -- left operand
58 (HsExpr tyvar uvar id pat) -- operator
59 Fixity -- Renamer adds fixity; bottom until then
60 (HsExpr tyvar uvar id pat) -- right operand
62 -- We preserve prefix negation and parenthesis for the precedence parser.
63 -- They are eventually removed by the type checker.
65 | NegApp (HsExpr tyvar uvar id pat) -- negated expr
66 (HsExpr tyvar uvar id pat) -- the negate id (in a HsVar)
68 | HsPar (HsExpr tyvar uvar id pat) -- parenthesised expr
70 | SectionL (HsExpr tyvar uvar id pat) -- operand
71 (HsExpr tyvar uvar id pat) -- operator
72 | SectionR (HsExpr tyvar uvar id pat) -- operator
73 (HsExpr tyvar uvar id pat) -- operand
75 | HsCase (HsExpr tyvar uvar id pat)
76 [Match tyvar uvar id pat] -- must have at least one Match
79 | HsIf (HsExpr tyvar uvar id pat) -- predicate
80 (HsExpr tyvar uvar id pat) -- then part
81 (HsExpr tyvar uvar id pat) -- else part
84 | HsLet (HsBinds tyvar uvar id pat) -- let(rec)
85 (HsExpr tyvar uvar id pat)
88 [Stmt tyvar uvar id pat] -- "do":one or more stmts
91 | HsDoOut DoOrListComp
92 [Stmt tyvar uvar id pat] -- "do":one or more stmts
96 (GenType tyvar uvar) -- Type of the whole expression
99 | ExplicitList -- syntactic list
100 [HsExpr tyvar uvar id pat]
101 | ExplicitListOut -- TRANSLATION
102 (GenType tyvar uvar) -- Gives type of components of list
103 [HsExpr tyvar uvar id pat]
105 | ExplicitTuple -- tuple
106 [HsExpr tyvar uvar id pat]
107 -- NB: Unit is ExplicitTuple []
108 -- for tuples, we can get the types
109 -- direct from the components
111 -- Record construction
112 | RecordCon (HsExpr tyvar uvar id pat) -- Always (HsVar id) until type checker,
113 -- but the latter adds its type args too
114 (HsRecordBinds tyvar uvar id pat)
117 | RecordUpd (HsExpr tyvar uvar id pat)
118 (HsRecordBinds tyvar uvar id pat)
120 | RecordUpdOut (HsExpr tyvar uvar id pat) -- TRANSLATION
121 (GenType tyvar uvar) -- Type of *result* record (may differ from
122 -- type of input record)
123 [id] -- Dicts needed for construction
124 (HsRecordBinds tyvar uvar id pat)
126 | ExprWithTySig -- signature binding
127 (HsExpr tyvar uvar id pat)
129 | ArithSeqIn -- arithmetic sequence
130 (ArithSeqInfo tyvar uvar id pat)
132 (HsExpr tyvar uvar id pat) -- (typechecked, of course)
133 (ArithSeqInfo tyvar uvar id pat)
135 | CCall FAST_STRING -- call into the C world; string is
136 [HsExpr tyvar uvar id pat] -- the C function; exprs are the
137 -- arguments to pass.
138 Bool -- True <=> might cause Haskell
139 -- garbage-collection (must generate
140 -- more paranoid code)
141 Bool -- True <=> it's really a "casm"
142 -- NOTE: this CCall is the *boxed*
143 -- version; the desugarer will convert
144 -- it into the unboxed "ccall#".
145 (GenType tyvar uvar) -- The result type; will be *bottom*
146 -- until the typechecker gets ahold of it
148 | HsSCC FAST_STRING -- "set cost centre" (_scc_) annotation
149 (HsExpr tyvar uvar id pat) -- expr whose cost is to be measured
152 Everything from here on appears only in typechecker output.
155 | TyLam -- TRANSLATION
157 (HsExpr tyvar uvar id pat)
158 | TyApp -- TRANSLATION
159 (HsExpr tyvar uvar id pat) -- generated by Spec
162 -- DictLam and DictApp are "inverses"
165 (HsExpr tyvar uvar id pat)
167 (HsExpr tyvar uvar id pat)
170 -- ClassDictLam and Dictionary are "inverses" (see note below)
172 [id] -- superclass dicts
174 (HsExpr tyvar uvar id pat)
176 [id] -- superclass dicts
179 | SingleDict -- a simple special case of Dictionary
180 id -- local dictionary name
182 type HsRecordBinds tyvar uvar id pat
183 = [(id, HsExpr tyvar uvar id pat, Bool)]
184 -- True <=> source code used "punning",
185 -- i.e. {op1, op2} rather than {op1=e1, op2=e2}
188 A @Dictionary@, unless of length 0 or 1, becomes a tuple. A
189 @ClassDictLam dictvars methods expr@ is, therefore:
191 \ x -> case x of ( dictvars-and-methods-tuple ) -> expr
195 instance (NamedThing id, Outputable id, Outputable pat,
196 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
197 Outputable (HsExpr tyvar uvar id pat) where
198 ppr sty expr = pprQuote sty $ \ sty -> pprExpr sty expr
202 pprExpr :: (NamedThing id, Outputable id, Outputable pat,
203 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
204 => PprStyle -> HsExpr tyvar uvar id pat -> Doc
206 pprExpr sty (HsVar v) = ppr sty v
208 pprExpr sty (HsLit lit) = ppr sty lit
209 pprExpr sty (HsLitOut lit _) = ppr sty lit
211 pprExpr sty (HsLam match)
212 = hsep [char '\\', nest 2 (pprMatch sty True match)]
214 pprExpr sty expr@(HsApp e1 e2)
215 = let (fun, args) = collect_args expr [] in
216 (pprExpr sty fun) <+> (sep (map (pprExpr sty) args))
218 collect_args (HsApp fun arg) args = collect_args fun (arg:args)
219 collect_args fun args = (fun, args)
221 pprExpr sty (OpApp e1 op fixity e2)
223 HsVar v -> pp_infixly v
226 pp_e1 = pprParendExpr sty e1 -- Add parens to make precedence clear
227 pp_e2 = pprParendExpr sty e2
230 = hang (pprExpr sty op) 4 (sep [pp_e1, pp_e2])
233 = sep [pp_e1, hsep [ppr sty v, pp_e2]]
235 pprExpr sty (NegApp e _)
236 = (<>) (char '-') (pprParendExpr sty e)
238 pprExpr sty (HsPar e)
239 = parens (pprExpr sty e)
241 pprExpr sty (SectionL expr op)
243 HsVar v -> pp_infixly v
246 pp_expr = pprParendExpr sty expr
248 pp_prefixly = hang (hsep [text " \\ x_ ->", ppr sty op])
249 4 (hsep [pp_expr, ptext SLIT("x_ )")])
250 pp_infixly v = parens (sep [pp_expr, ppr sty v])
252 pprExpr sty (SectionR op expr)
254 HsVar v -> pp_infixly v
257 pp_expr = pprParendExpr sty expr
259 pp_prefixly = hang (hsep [text "( \\ x_ ->", ppr sty op, ptext SLIT("x_")])
260 4 ((<>) pp_expr rparen)
262 = parens (sep [ppr sty v, pp_expr])
264 pprExpr sty (HsCase expr matches _)
265 = sep [ sep [ptext SLIT("case"), nest 4 (pprExpr sty expr), ptext SLIT("of")],
266 nest 2 (pprMatches sty (True, empty) matches) ]
268 pprExpr sty (HsIf e1 e2 e3 _)
269 = sep [hsep [ptext SLIT("if"), nest 2 (pprExpr sty e1), ptext SLIT("then")],
270 nest 4 (pprExpr sty e2),
272 nest 4 (pprExpr sty e3)]
274 -- special case: let ... in let ...
275 pprExpr sty (HsLet binds expr@(HsLet _ _))
276 = sep [hang (ptext SLIT("let")) 2 (hsep [ppr sty binds, ptext SLIT("in")]),
279 pprExpr sty (HsLet binds expr)
280 = sep [hang (ptext SLIT("let")) 2 (ppr sty binds),
281 hang (ptext SLIT("in")) 2 (ppr sty expr)]
283 pprExpr sty (HsDo do_or_list_comp stmts _) = pprDo do_or_list_comp sty stmts
284 pprExpr sty (HsDoOut do_or_list_comp stmts _ _ _ _ _) = pprDo do_or_list_comp sty stmts
286 pprExpr sty (ExplicitList exprs)
287 = brackets (fsep (punctuate comma (map (pprExpr sty) exprs)))
288 pprExpr sty (ExplicitListOut ty exprs)
289 = hcat [ brackets (fsep (punctuate comma (map (pprExpr sty) exprs))),
290 ifnotPprForUser sty ((<>) space (parens (pprGenType sty ty))) ]
292 pprExpr sty (ExplicitTuple exprs)
293 = parens (sep (punctuate comma (map (pprExpr sty) exprs)))
295 pprExpr sty (RecordCon con rbinds)
296 = pp_rbinds sty (ppr sty con) rbinds
298 pprExpr sty (RecordUpd aexp rbinds)
299 = pp_rbinds sty (pprParendExpr sty aexp) rbinds
300 pprExpr sty (RecordUpdOut aexp _ _ rbinds)
301 = pp_rbinds sty (pprParendExpr sty aexp) rbinds
303 pprExpr sty (ExprWithTySig expr sig)
304 = hang ((<>) (nest 2 (pprExpr sty expr)) (ptext SLIT(" ::")))
307 pprExpr sty (ArithSeqIn info)
308 = brackets (ppr sty info)
309 pprExpr sty (ArithSeqOut expr info)
310 | userStyle sty = brackets (ppr sty info)
311 | otherwise = brackets (hcat [parens (ppr sty expr), space, ppr sty info])
313 pprExpr sty (CCall fun args _ is_asm result_ty)
315 then hcat [ptext SLIT("_casm_ ``"), ptext fun, ptext SLIT("''")]
316 else (<>) (ptext SLIT("_ccall_ ")) (ptext fun))
317 4 (sep (map (pprParendExpr sty) args))
319 pprExpr sty (HsSCC label expr)
320 = sep [ (<>) (ptext SLIT("_scc_ ")) (hcat [char '"', ptext label, char '"']),
321 pprParendExpr sty expr ]
323 pprExpr sty (TyLam tyvars expr)
324 = hang (hsep [ptext SLIT("/\\"), interppSP sty tyvars, ptext SLIT("->")])
327 pprExpr sty (TyApp expr [ty])
328 = hang (pprExpr sty expr) 4 (pprParendGenType sty ty)
330 pprExpr sty (TyApp expr tys)
331 = hang (pprExpr sty expr)
332 4 (brackets (interpp'SP sty tys))
334 pprExpr sty (DictLam dictvars expr)
335 = hang (hsep [ptext SLIT("\\{-dict-}"), interppSP sty dictvars, ptext SLIT("->")])
338 pprExpr sty (DictApp expr [dname])
339 = hang (pprExpr sty expr) 4 (ppr sty dname)
341 pprExpr sty (DictApp expr dnames)
342 = hang (pprExpr sty expr)
343 4 (brackets (interpp'SP sty dnames))
345 pprExpr sty (ClassDictLam dicts methods expr)
346 = hang (hsep [ptext SLIT("\\{-classdict-}"),
347 brackets (interppSP sty dicts),
348 brackets (interppSP sty methods),
352 pprExpr sty (Dictionary dicts methods)
353 = parens (sep [ptext SLIT("{-dict-}"),
354 brackets (interpp'SP sty dicts),
355 brackets (interpp'SP sty methods)])
357 pprExpr sty (SingleDict dname)
358 = hsep [ptext SLIT("{-singleDict-}"), ppr sty dname]
362 Parenthesize unless very simple:
364 pprParendExpr :: (NamedThing id, Outputable id, Outputable pat,
365 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
366 => PprStyle -> HsExpr tyvar uvar id pat -> Doc
368 pprParendExpr sty expr
370 pp_as_was = pprExpr sty expr
374 HsLitOut l _ -> ppr sty l
377 ExplicitList _ -> pp_as_was
378 ExplicitListOut _ _ -> pp_as_was
379 ExplicitTuple _ -> pp_as_was
382 _ -> parens pp_as_was
385 %************************************************************************
387 \subsection{Record binds}
389 %************************************************************************
392 pp_rbinds :: (NamedThing id, Outputable id, Outputable pat,
393 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
395 -> HsRecordBinds tyvar uvar id pat -> Doc
397 pp_rbinds sty thing rbinds
399 4 (braces (hsep (punctuate comma (map (pp_rbind sty) rbinds))))
401 pp_rbind sty (v, _, True) | userStyle sty = ppr sty v
402 pp_rbind sty (v, e, _) = hsep [ppr sty v, char '=', ppr sty e]
405 %************************************************************************
407 \subsection{Do stmts and list comprehensions}
409 %************************************************************************
412 data DoOrListComp = DoStmt | ListComp
414 pprDo DoStmt sty stmts
415 = hang (ptext SLIT("do")) 2 (vcat (map (ppr sty) stmts))
416 pprDo ListComp sty stmts
417 = hang (hsep [lbrack, pprExpr sty expr, char '|'])
418 4 (sep [interpp'SP sty quals, rbrack])
420 ReturnStmt expr = last stmts -- Last stmt should be a ReturnStmt for list comps
425 data Stmt tyvar uvar id pat
427 (HsExpr tyvar uvar id pat)
430 | LetStmt (HsBinds tyvar uvar id pat)
432 | GuardStmt (HsExpr tyvar uvar id pat) -- List comps only
435 | ExprStmt (HsExpr tyvar uvar id pat) -- Do stmts only
438 | ReturnStmt (HsExpr tyvar uvar id pat) -- List comps only, at the end
442 instance (NamedThing id, Outputable id, Outputable pat,
443 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
444 Outputable (Stmt tyvar uvar id pat) where
445 ppr sty stmt = pprQuote sty $ \ sty -> pprStmt sty stmt
447 pprStmt sty (BindStmt pat expr _)
448 = hsep [ppr sty pat, ptext SLIT("<-"), ppr sty expr]
449 pprStmt sty (LetStmt binds)
450 = hsep [ptext SLIT("let"), ppr sty binds]
451 pprStmt sty (ExprStmt expr _)
453 pprStmt sty (GuardStmt expr _)
455 pprStmt sty (ReturnStmt expr)
456 = hsep [ptext SLIT("return"), ppr sty expr]
459 %************************************************************************
461 \subsection{Enumerations and list comprehensions}
463 %************************************************************************
466 data ArithSeqInfo tyvar uvar id pat
467 = From (HsExpr tyvar uvar id pat)
468 | FromThen (HsExpr tyvar uvar id pat)
469 (HsExpr tyvar uvar id pat)
470 | FromTo (HsExpr tyvar uvar id pat)
471 (HsExpr tyvar uvar id pat)
472 | FromThenTo (HsExpr tyvar uvar id pat)
473 (HsExpr tyvar uvar id pat)
474 (HsExpr tyvar uvar id pat)
478 instance (NamedThing id, Outputable id, Outputable pat,
479 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
480 Outputable (ArithSeqInfo tyvar uvar id pat) where
481 ppr sty (From e1) = hcat [ppr sty e1, pp_dotdot]
482 ppr sty (FromThen e1 e2) = hcat [ppr sty e1, comma, space, ppr sty e2, pp_dotdot]
483 ppr sty (FromTo e1 e3) = hcat [ppr sty e1, pp_dotdot, ppr sty e3]
484 ppr sty (FromThenTo e1 e2 e3)
485 = hcat [ppr sty e1, comma, space, ppr sty e2, pp_dotdot, ppr sty e3]
487 pp_dotdot = ptext SLIT(" .. ")