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 Outputable --( interppSP, interpp'SP, ifnotPprForUser )
23 import PprType ( pprGenType, pprParendGenType, GenType{-instance-} )
25 import PprStyle ( PprStyle(..), userStyle )
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 sty (HsVar v) = ppr sty v
204 pprExpr sty (HsLit lit) = ppr sty lit
205 pprExpr sty (HsLitOut lit _) = ppr sty lit
207 pprExpr sty (HsLam match)
208 = hsep [char '\\', nest 2 (pprMatch sty True match)]
210 pprExpr sty expr@(HsApp e1 e2)
211 = let (fun, args) = collect_args expr [] in
212 hang (pprExpr sty fun) 4 (sep (map (pprExpr sty) args))
214 collect_args (HsApp fun arg) args = collect_args fun (arg:args)
215 collect_args fun args = (fun, args)
217 pprExpr sty (OpApp e1 op fixity e2)
219 HsVar v -> pp_infixly v
222 pp_e1 = pprParendExpr sty e1 -- Add parens to make precedence clear
223 pp_e2 = pprParendExpr sty e2
226 = hang (pprExpr sty op) 4 (sep [pp_e1, pp_e2])
229 = sep [pp_e1, hsep [ppr sty v, pp_e2]]
231 pprExpr sty (NegApp e _)
232 = (<>) (char '-') (pprParendExpr sty e)
234 pprExpr sty (HsPar e)
235 = parens (pprExpr sty e)
237 pprExpr sty (SectionL expr op)
239 HsVar v -> pp_infixly v
242 pp_expr = pprParendExpr sty expr
244 pp_prefixly = hang (hsep [text " \\ x_ ->", ppr sty op])
245 4 (hsep [pp_expr, ptext SLIT("x_ )")])
246 pp_infixly v = parens (sep [pp_expr, ppr sty v])
248 pprExpr sty (SectionR op expr)
250 HsVar v -> pp_infixly v
253 pp_expr = pprParendExpr sty expr
255 pp_prefixly = hang (hsep [text "( \\ x_ ->", ppr sty op, ptext SLIT("x_")])
256 4 ((<>) pp_expr rparen)
258 = parens (sep [ppr sty v, pp_expr])
260 pprExpr sty (HsCase expr matches _)
261 = sep [ sep [ptext SLIT("case"), nest 4 (pprExpr sty expr), ptext SLIT("of")],
262 nest 2 (pprMatches sty (True, empty) matches) ]
264 pprExpr sty (HsIf e1 e2 e3 _)
265 = sep [hsep [ptext SLIT("if"), nest 2 (pprExpr sty e1), ptext SLIT("then")],
266 nest 4 (pprExpr sty e2),
268 nest 4 (pprExpr sty e3)]
270 -- special case: let ... in let ...
271 pprExpr sty (HsLet binds expr@(HsLet _ _))
272 = sep [hang (ptext SLIT("let")) 2 (hsep [ppr sty binds, ptext SLIT("in")]),
275 pprExpr sty (HsLet binds expr)
276 = sep [hang (ptext SLIT("let")) 2 (ppr sty binds),
277 hang (ptext SLIT("in")) 2 (ppr sty expr)]
279 pprExpr sty (HsDo do_or_list_comp stmts _) = pprDo do_or_list_comp sty stmts
280 pprExpr sty (HsDoOut do_or_list_comp stmts _ _ _ _ _) = pprDo do_or_list_comp sty stmts
282 pprExpr sty (ExplicitList exprs)
283 = brackets (fsep (punctuate comma (map (pprExpr sty) exprs)))
284 pprExpr sty (ExplicitListOut ty exprs)
285 = hcat [ brackets (fsep (punctuate comma (map (pprExpr sty) exprs))),
286 ifnotPprForUser sty ((<>) space (parens (pprGenType sty ty))) ]
288 pprExpr sty (ExplicitTuple exprs)
289 = parens (sep (punctuate comma (map (pprExpr sty) exprs)))
291 pprExpr sty (RecordCon con rbinds)
292 = pp_rbinds sty (ppr sty con) rbinds
294 pprExpr sty (RecordUpd aexp rbinds)
295 = pp_rbinds sty (pprParendExpr sty aexp) rbinds
296 pprExpr sty (RecordUpdOut aexp _ _ rbinds)
297 = pp_rbinds sty (pprParendExpr sty aexp) rbinds
299 pprExpr sty (ExprWithTySig expr sig)
300 = hang ((<>) (nest 2 (pprExpr sty expr)) (ptext SLIT(" ::")))
303 pprExpr sty (ArithSeqIn info)
304 = brackets (ppr sty info)
305 pprExpr sty (ArithSeqOut expr info)
306 | userStyle sty = brackets (ppr sty info)
307 | otherwise = brackets (hcat [parens (ppr sty expr), space, ppr sty info])
309 pprExpr sty (CCall fun args _ is_asm result_ty)
311 then hcat [ptext SLIT("_casm_ ``"), ptext fun, ptext SLIT("''")]
312 else (<>) (ptext SLIT("_ccall_ ")) (ptext fun))
313 4 (sep (map (pprParendExpr sty) args))
315 pprExpr sty (HsSCC label expr)
316 = sep [ (<>) (ptext SLIT("_scc_ ")) (hcat [char '"', ptext label, char '"']),
317 pprParendExpr sty expr ]
319 pprExpr sty (TyLam tyvars expr)
320 = hang (hsep [ptext SLIT("/\\"), interppSP sty tyvars, ptext SLIT("->")])
323 pprExpr sty (TyApp expr [ty])
324 = hang (pprExpr sty expr) 4 (pprParendGenType sty ty)
326 pprExpr sty (TyApp expr tys)
327 = hang (pprExpr sty expr)
328 4 (brackets (interpp'SP sty tys))
330 pprExpr sty (DictLam dictvars expr)
331 = hang (hsep [ptext SLIT("\\{-dict-}"), interppSP sty dictvars, ptext SLIT("->")])
334 pprExpr sty (DictApp expr [dname])
335 = hang (pprExpr sty expr) 4 (ppr sty dname)
337 pprExpr sty (DictApp expr dnames)
338 = hang (pprExpr sty expr)
339 4 (brackets (interpp'SP sty dnames))
341 pprExpr sty (ClassDictLam dicts methods expr)
342 = hang (hsep [ptext SLIT("\\{-classdict-}"),
343 brackets (interppSP sty dicts),
344 brackets (interppSP sty methods),
348 pprExpr sty (Dictionary dicts methods)
349 = parens (sep [ptext SLIT("{-dict-}"),
350 brackets (interpp'SP sty dicts),
351 brackets (interpp'SP sty methods)])
353 pprExpr sty (SingleDict dname)
354 = hsep [ptext SLIT("{-singleDict-}"), ppr sty dname]
358 Parenthesize unless very simple:
360 pprParendExpr :: (NamedThing id, Outputable id, Outputable pat,
361 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
362 => PprStyle -> HsExpr tyvar uvar id pat -> Doc
364 pprParendExpr sty expr
366 pp_as_was = pprExpr sty expr
370 HsLitOut l _ -> ppr sty l
373 ExplicitList _ -> pp_as_was
374 ExplicitListOut _ _ -> pp_as_was
375 ExplicitTuple _ -> pp_as_was
378 _ -> parens pp_as_was
381 %************************************************************************
383 \subsection{Record binds}
385 %************************************************************************
388 pp_rbinds :: (NamedThing id, Outputable id, Outputable pat,
389 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
391 -> HsRecordBinds tyvar uvar id pat -> Doc
393 pp_rbinds sty thing rbinds
395 4 (braces (hsep (punctuate comma (map (pp_rbind sty) rbinds))))
397 pp_rbind sty (v, _, True) | userStyle sty = ppr sty v
398 pp_rbind sty (v, e, _) = hsep [ppr sty v, char '=', ppr sty e]
401 %************************************************************************
403 \subsection{Do stmts and list comprehensions}
405 %************************************************************************
408 data DoOrListComp = DoStmt | ListComp
410 pprDo DoStmt sty stmts
411 = hang (ptext SLIT("do")) 2 (vcat (map (ppr sty) stmts))
412 pprDo ListComp sty stmts
413 = hang (hsep [lbrack, pprExpr sty expr, char '|'])
414 4 (sep [interpp'SP sty quals, rbrack])
416 ReturnStmt expr = last stmts -- Last stmt should be a ReturnStmt for list comps
421 data Stmt tyvar uvar id pat
423 (HsExpr tyvar uvar id pat)
426 | LetStmt (HsBinds tyvar uvar id pat)
428 | GuardStmt (HsExpr tyvar uvar id pat) -- List comps only
431 | ExprStmt (HsExpr tyvar uvar id pat) -- Do stmts only
434 | ReturnStmt (HsExpr tyvar uvar id pat) -- List comps only, at the end
438 instance (NamedThing id, Outputable id, Outputable pat,
439 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
440 Outputable (Stmt tyvar uvar id pat) where
441 ppr sty stmt = pprQuote sty $ \ sty -> pprStmt sty stmt
443 pprStmt sty (BindStmt pat expr _)
444 = hsep [ppr sty pat, ptext SLIT("<-"), ppr sty expr]
445 pprStmt sty (LetStmt binds)
446 = hsep [ptext SLIT("let"), ppr sty binds]
447 pprStmt sty (ExprStmt expr _)
449 pprStmt sty (GuardStmt expr _)
451 pprStmt sty (ReturnStmt expr)
452 = hsep [ptext 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) = hcat [ppr sty e1, pp_dotdot]
478 ppr sty (FromThen e1 e2) = hcat [ppr sty e1, comma, space, ppr sty e2, pp_dotdot]
479 ppr sty (FromTo e1 e3) = hcat [ppr sty e1, pp_dotdot, ppr sty e3]
480 ppr sty (FromThenTo e1 e2 e3)
481 = hcat [ppr sty e1, comma, space, ppr sty e2, pp_dotdot, ppr sty e3]
483 pp_dotdot = ptext SLIT(" .. ")