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)
85 | HsDo [Stmt tyvar uvar id pat] -- "do":one or more stmts
88 | HsDoOut [Stmt tyvar uvar id pat] -- "do":one or more stmts
89 id -- id for >>=, types applied
90 id -- id for zero, typed applied
93 | ListComp (HsExpr tyvar uvar id pat) -- list comprehension
94 [Qualifier tyvar uvar id pat] -- at least one Qualifier
96 | ExplicitList -- syntactic list
97 [HsExpr tyvar uvar id pat]
98 | ExplicitListOut -- TRANSLATION
99 (GenType tyvar uvar) -- Gives type of components of list
100 [HsExpr tyvar uvar id pat]
102 | ExplicitTuple -- tuple
103 [HsExpr tyvar uvar id pat]
104 -- NB: Unit is ExplicitTuple []
105 -- for tuples, we can get the types
106 -- direct from the components
108 -- Record construction
109 | RecordCon (HsExpr tyvar uvar id pat) -- Always (HsVar id) until type checker,
110 -- but the latter adds its type args too
111 (HsRecordBinds tyvar uvar id pat)
114 | RecordUpd (HsExpr tyvar uvar id pat)
115 (HsRecordBinds tyvar uvar id pat)
117 | RecordUpdOut (HsExpr tyvar uvar id pat) -- TRANSLATION
118 [id] -- Dicts needed for construction
119 (HsRecordBinds tyvar uvar id pat)
121 | ExprWithTySig -- signature binding
122 (HsExpr tyvar uvar id pat)
124 | ArithSeqIn -- arithmetic sequence
125 (ArithSeqInfo tyvar uvar id pat)
127 (HsExpr tyvar uvar id pat) -- (typechecked, of course)
128 (ArithSeqInfo tyvar uvar id pat)
130 | CCall FAST_STRING -- call into the C world; string is
131 [HsExpr tyvar uvar id pat] -- the C function; exprs are the
132 -- arguments to pass.
133 Bool -- True <=> might cause Haskell
134 -- garbage-collection (must generate
135 -- more paranoid code)
136 Bool -- True <=> it's really a "casm"
137 -- NOTE: this CCall is the *boxed*
138 -- version; the desugarer will convert
139 -- it into the unboxed "ccall#".
140 (GenType tyvar uvar) -- The result type; will be *bottom*
141 -- until the typechecker gets ahold of it
143 | HsSCC FAST_STRING -- "set cost centre" (_scc_) annotation
144 (HsExpr tyvar uvar id pat) -- expr whose cost is to be measured
147 Everything from here on appears only in typechecker output.
150 | TyLam -- TRANSLATION
152 (HsExpr tyvar uvar id pat)
153 | TyApp -- TRANSLATION
154 (HsExpr tyvar uvar id pat) -- generated by Spec
157 -- DictLam and DictApp are "inverses"
160 (HsExpr tyvar uvar id pat)
162 (HsExpr tyvar uvar id pat)
165 -- ClassDictLam and Dictionary are "inverses" (see note below)
167 [id] -- superclass dicts
169 (HsExpr tyvar uvar id pat)
171 [id] -- superclass dicts
174 | SingleDict -- a simple special case of Dictionary
175 id -- local dictionary name
177 type HsRecordBinds tyvar uvar id pat
178 = [(id, HsExpr tyvar uvar id pat, Bool)]
179 -- True <=> source code used "punning",
180 -- i.e. {op1, op2} rather than {op1=e1, op2=e2}
183 A @Dictionary@, unless of length 0 or 1, becomes a tuple. A
184 @ClassDictLam dictvars methods expr@ is, therefore:
186 \ x -> case x of ( dictvars-and-methods-tuple ) -> expr
190 instance (NamedThing id, Outputable id, Outputable pat,
191 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
192 Outputable (HsExpr tyvar uvar id pat) where
197 pprExpr sty (HsVar v) = ppr sty v
199 pprExpr sty (HsLit lit) = ppr sty lit
200 pprExpr sty (HsLitOut lit _) = ppr sty lit
202 pprExpr sty (HsLam match)
203 = ppCat [ppStr "\\", ppNest 2 (pprMatch sty True match)]
205 pprExpr sty expr@(HsApp e1 e2)
206 = let (fun, args) = collect_args expr [] in
207 ppHang (pprExpr sty fun) 4 (ppSep (map (pprExpr sty) args))
209 collect_args (HsApp fun arg) args = collect_args fun (arg:args)
210 collect_args fun args = (fun, args)
212 pprExpr sty (OpApp e1 op fixity e2)
214 HsVar v -> pp_infixly v
217 pp_e1 = pprParendExpr sty e1 -- Add parens to make precedence clear
218 pp_e2 = pprParendExpr sty e2
221 = ppHang (pprExpr sty op) 4 (ppSep [pp_e1, pp_e2])
224 = ppSep [pp_e1, ppCat [ppr sty v, pp_e2]]
226 pprExpr sty (NegApp e _)
227 = ppBeside (ppChar '-') (pprParendExpr sty e)
229 pprExpr sty (HsPar e)
230 = ppParens (pprExpr sty e)
232 pprExpr sty (SectionL expr op)
234 HsVar v -> pp_infixly v
237 pp_expr = pprParendExpr sty expr
239 pp_prefixly = ppHang (ppCat [ppStr "( \\ x_ ->", ppr sty op])
240 4 (ppCat [pp_expr, ppStr "x_ )"])
242 = ppSep [ ppBeside ppLparen pp_expr,
243 ppBeside (ppr sty v) ppRparen ]
245 pprExpr sty (SectionR op expr)
247 HsVar v -> pp_infixly v
250 pp_expr = pprParendExpr sty expr
252 pp_prefixly = ppHang (ppCat [ppStr "( \\ x_ ->", ppr sty op, ppPStr SLIT("x_")])
253 4 (ppBeside pp_expr ppRparen)
255 = ppSep [ ppBeside ppLparen (ppr sty v),
256 ppBeside pp_expr ppRparen ]
258 pprExpr sty (HsCase expr matches _)
259 = ppSep [ ppSep [ppPStr SLIT("case"), ppNest 4 (pprExpr sty expr), ppPStr SLIT("of")],
260 ppNest 2 (pprMatches sty (True, ppNil) matches) ]
262 pprExpr sty (HsIf e1 e2 e3 _)
263 = ppSep [ppCat [ppPStr SLIT("if"), ppNest 2 (pprExpr sty e1), ppPStr SLIT("then")],
264 ppNest 4 (pprExpr sty e2),
266 ppNest 4 (pprExpr sty e3)]
268 -- special case: let ... in let ...
269 pprExpr sty (HsLet binds expr@(HsLet _ _))
270 = ppSep [ppHang (ppPStr SLIT("let")) 2 (ppCat [ppr sty binds, ppPStr SLIT("in")]),
273 pprExpr sty (HsLet binds expr)
274 = ppSep [ppHang (ppPStr SLIT("let")) 2 (ppr sty binds),
275 ppHang (ppPStr SLIT("in")) 2 (ppr sty expr)]
277 pprExpr sty (HsDo stmts _)
278 = ppHang (ppPStr SLIT("do")) 2 (ppAboves (map (ppr sty) stmts))
279 pprExpr sty (HsDoOut stmts _ _ _)
280 = ppHang (ppPStr SLIT("do")) 2 (ppAboves (map (ppr sty) stmts))
282 pprExpr sty (ListComp expr quals)
283 = ppHang (ppCat [ppLbrack, pprExpr sty expr, ppChar '|'])
284 4 (ppSep [interpp'SP sty quals, ppRbrack])
286 pprExpr sty (ExplicitList exprs)
287 = ppBracket (ppInterleave ppComma (map (pprExpr sty) exprs))
288 pprExpr sty (ExplicitListOut ty exprs)
289 = ppBesides [ ppBracket (ppInterleave ppComma (map (pprExpr sty) exprs)),
290 ifnotPprForUser sty (ppBeside ppSP (ppParens (pprGenType sty ty))) ]
292 pprExpr sty (ExplicitTuple exprs)
293 = ppParens (ppInterleave ppComma (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 = ppHang (ppBeside (ppNest 2 (pprExpr sty expr)) (ppPStr SLIT(" ::")))
307 pprExpr sty (ArithSeqIn info)
308 = ppBracket (ppr sty info)
309 pprExpr sty (ArithSeqOut expr info)
312 ppBracket (ppr sty info)
314 ppBesides [ppLbrack, ppParens (ppr sty expr), ppr sty info, ppRbrack]
316 pprExpr sty (CCall fun args _ is_asm result_ty)
318 then ppBesides [ppStr "_casm_ ``", ppPStr fun, ppStr "''"]
319 else ppBeside (ppPStr SLIT("_ccall_ ")) (ppPStr fun))
320 4 (ppSep (map (pprParendExpr sty) args))
322 pprExpr sty (HsSCC label expr)
323 = ppSep [ ppBeside (ppPStr SLIT("_scc_ ")) (ppBesides [ppChar '"', ppPStr label, ppChar '"']),
324 pprParendExpr sty expr ]
326 pprExpr sty (TyLam tyvars expr)
327 = ppHang (ppCat [ppStr "/\\", interppSP sty tyvars, ppStr "->"])
330 pprExpr sty (TyApp expr [ty])
331 = ppHang (pprExpr sty expr) 4 (pprParendGenType sty ty)
333 pprExpr sty (TyApp expr tys)
334 = ppHang (pprExpr sty expr)
335 4 (ppBracket (interpp'SP sty tys))
337 pprExpr sty (DictLam dictvars expr)
338 = ppHang (ppCat [ppStr "\\{-dict-}", interppSP sty dictvars, ppStr "->"])
341 pprExpr sty (DictApp expr [dname])
342 = ppHang (pprExpr sty expr) 4 (ppr sty dname)
344 pprExpr sty (DictApp expr dnames)
345 = ppHang (pprExpr sty expr)
346 4 (ppBracket (interpp'SP sty dnames))
348 pprExpr sty (ClassDictLam dicts methods expr)
349 = ppHang (ppCat [ppStr "\\{-classdict-}",
350 ppBracket (interppSP sty dicts),
351 ppBracket (interppSP sty methods),
355 pprExpr sty (Dictionary dicts methods)
356 = ppSep [ppBesides [ppLparen, ppPStr SLIT("{-dict-}")],
357 ppBracket (interpp'SP sty dicts),
358 ppBesides [ppBracket (interpp'SP sty methods), ppRparen]]
360 pprExpr sty (SingleDict dname)
361 = ppCat [ppPStr SLIT("{-singleDict-}"), ppr sty dname]
365 Parenthesize unless very simple:
367 pprParendExpr :: (NamedThing id, Outputable id, Outputable pat,
368 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
369 => PprStyle -> HsExpr tyvar uvar id pat -> Pretty
371 pprParendExpr sty expr
373 pp_as_was = pprExpr sty expr
377 HsLitOut l _ -> ppr sty l
380 ExplicitList _ -> pp_as_was
381 ExplicitListOut _ _ -> pp_as_was
382 ExplicitTuple _ -> pp_as_was
385 _ -> ppParens pp_as_was
388 %************************************************************************
390 \subsection{Record binds}
392 %************************************************************************
395 pp_rbinds :: (NamedThing id, Outputable id, Outputable pat,
396 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
397 => PprStyle -> Pretty
398 -> HsRecordBinds tyvar uvar id pat -> Pretty
400 pp_rbinds sty thing rbinds
402 4 (ppCurlies (ppIntersperse pp'SP (map (pp_rbind sty) rbinds)))
404 pp_rbind PprForUser (v, _, True) = ppr PprForUser v
405 pp_rbind sty (v, e, _) = ppCat [ppr sty v, ppStr "=", ppr sty e]
408 %************************************************************************
410 \subsection{Do stmts}
412 %************************************************************************
415 data Stmt tyvar uvar id pat
417 (HsExpr tyvar uvar id pat)
419 | ExprStmt (HsExpr tyvar uvar id pat)
421 | LetStmt (HsBinds tyvar uvar id pat)
423 -- Translations; the types are the "a" and "b" types of the monad.
424 | BindStmtOut pat (HsExpr tyvar uvar id pat) SrcLoc (GenType tyvar uvar) (GenType tyvar uvar)
425 | ExprStmtOut (HsExpr tyvar uvar id pat) SrcLoc (GenType tyvar uvar) (GenType tyvar uvar)
429 instance (NamedThing id, Outputable id, Outputable pat,
430 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
431 Outputable (Stmt tyvar uvar id pat) where
432 ppr sty (BindStmt pat expr _)
433 = ppCat [ppr sty pat, ppStr "<-", ppr sty expr]
434 ppr sty (LetStmt binds)
435 = ppCat [ppPStr SLIT("let"), ppr sty binds]
436 ppr sty (ExprStmt expr _)
438 ppr sty (BindStmtOut pat expr _ _ _)
439 = ppCat [ppr sty pat, ppStr "<-", ppr sty expr]
440 ppr sty (ExprStmtOut expr _ _ _)
444 %************************************************************************
446 \subsection{Enumerations and list comprehensions}
448 %************************************************************************
451 data ArithSeqInfo tyvar uvar id pat
452 = From (HsExpr tyvar uvar id pat)
453 | FromThen (HsExpr tyvar uvar id pat)
454 (HsExpr tyvar uvar id pat)
455 | FromTo (HsExpr tyvar uvar id pat)
456 (HsExpr tyvar uvar id pat)
457 | FromThenTo (HsExpr tyvar uvar id pat)
458 (HsExpr tyvar uvar id pat)
459 (HsExpr tyvar uvar id pat)
463 instance (NamedThing id, Outputable id, Outputable pat,
464 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
465 Outputable (ArithSeqInfo tyvar uvar id pat) where
466 ppr sty (From e1) = ppBesides [ppr sty e1, pp_dotdot]
467 ppr sty (FromThen e1 e2) = ppBesides [ppr sty e1, pp'SP, ppr sty e2, pp_dotdot]
468 ppr sty (FromTo e1 e3) = ppBesides [ppr sty e1, pp_dotdot, ppr sty e3]
469 ppr sty (FromThenTo e1 e2 e3)
470 = ppBesides [ppr sty e1, pp'SP, ppr sty e2, pp_dotdot, ppr sty e3]
472 pp_dotdot = ppPStr SLIT(" .. ")
475 ``Qualifiers'' in list comprehensions:
477 data Qualifier tyvar uvar id pat
479 (HsExpr tyvar uvar id pat)
480 | LetQual (HsBinds tyvar uvar id pat)
481 | FilterQual (HsExpr tyvar uvar id pat)
485 instance (NamedThing id, Outputable id, Outputable pat,
486 Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
487 Outputable (Qualifier tyvar uvar id pat) where
488 ppr sty (GeneratorQual pat expr)
489 = ppCat [ppr sty pat, ppStr "<-", ppr sty expr]
490 ppr sty (LetQual binds)
491 = ppCat [ppPStr SLIT("let"), ppr sty binds]
492 ppr sty (FilterQual expr)