fc9356ade7703ca4ea1de0b8520f5f3f082eb061
[ghc-hetmet.git] / ghc / compiler / hsSyn / HsExpr.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1994
3 %
4 \section[HsExpr]{Abstract Haskell syntax: expressions}
5
6 \begin{code}
7 #include "HsVersions.h"
8
9 module HsExpr where
10
11 import Ubiq{-uitous-}
12 import HsLoop -- for paranoia checking
13
14 -- friends:
15 import HsBinds          ( HsBinds )
16 import HsLit            ( HsLit )
17 import HsMatches        ( pprMatches, pprMatch, Match )
18 import HsTypes          ( PolyType )
19
20 -- others:
21 import Id               ( DictVar(..), GenId, Id(..) )
22 import Outputable
23 import PprType          ( pprGenType, pprParendGenType, GenType{-instance-} )
24 import Pretty
25 import PprStyle         ( PprStyle(..) )
26 import SrcLoc           ( SrcLoc )
27 import Usage            ( GenUsage{-instance-} )
28 import Util             ( panic{-ToDo:rm eventually-} )
29 \end{code}
30
31 %************************************************************************
32 %*                                                                      *
33 \subsection{Expressions proper}
34 %*                                                                      *
35 %************************************************************************
36
37 \begin{code}
38 data HsExpr tyvar uvar id pat
39   = HsVar       id                              -- variable
40   | HsLit       HsLit                           -- literal
41   | HsLitOut    HsLit                           -- TRANSLATION
42                 (GenType tyvar uvar)            -- (with its type)
43
44   | HsLam       (Match  tyvar uvar id pat)      -- lambda
45   | HsApp       (HsExpr tyvar uvar id pat)      -- application
46                 (HsExpr tyvar uvar id pat)
47
48   -- Operator applications and sections.
49   -- NB Bracketed ops such as (+) come out as Vars.
50
51   | OpApp       (HsExpr tyvar uvar id pat)      -- left operand
52                 (HsExpr tyvar uvar id pat)      -- operator
53                 (HsExpr tyvar uvar id pat)      -- right operand
54
55   -- ADR Question? Why is the "op" in a section an expr when it will
56   -- have to be of the form (HsVar op) anyway?
57   -- WDP Answer: But when the typechecker gets ahold of it, it may
58   -- apply the var to a few types; it will then be an expression.
59
60   | SectionL    (HsExpr tyvar uvar id pat)      -- operand
61                 (HsExpr tyvar uvar id pat)      -- operator
62   | SectionR    (HsExpr tyvar uvar id pat)      -- operator
63                 (HsExpr tyvar uvar id pat)      -- operand
64                                 
65
66   | HsCase      (HsExpr tyvar uvar id pat)
67                 [Match  tyvar uvar id pat]      -- must have at least one Match
68                 SrcLoc
69
70   | HsIf        (HsExpr tyvar uvar id pat)      --  predicate
71                 (HsExpr tyvar uvar id pat)      --  then part
72                 (HsExpr tyvar uvar id pat)      --  else part
73                 SrcLoc
74
75   | HsLet       (HsBinds tyvar uvar id pat)     -- let(rec)
76                 (HsExpr  tyvar uvar id pat)
77
78   | HsDo        [Stmt tyvar uvar id pat]        -- "do":one or more stmts
79                 SrcLoc
80
81   | HsDoOut     [Stmt tyvar uvar id pat]        -- "do":one or more stmts
82                 id id                           -- Monad and MonadZero dicts
83                 SrcLoc
84
85   | ListComp    (HsExpr tyvar uvar id pat)      -- list comprehension
86                 [Qual   tyvar uvar id pat]      -- at least one Qual(ifier)
87
88   | ExplicitList                -- syntactic list
89                 [HsExpr tyvar uvar id pat]
90   | ExplicitListOut             -- TRANSLATION
91                 (GenType tyvar uvar)    -- Gives type of components of list
92                 [HsExpr tyvar uvar id pat]
93
94   | ExplicitTuple               -- tuple
95                 [HsExpr tyvar uvar id pat]
96                                 -- NB: Unit is ExplicitTuple []
97                                 -- for tuples, we can get the types
98                                 -- direct from the components
99
100         -- Record construction
101   | RecordCon   (HsExpr tyvar uvar id pat)      -- Always (HsVar id) until type checker,
102                                                 -- but the latter adds its type args too
103                 (HsRecordBinds tyvar uvar id pat)
104
105         -- Record update
106   | RecordUpd   (HsExpr tyvar uvar id pat)
107                 (HsRecordBinds tyvar uvar id pat)
108
109   | ExprWithTySig               -- signature binding
110                 (HsExpr tyvar uvar id pat)
111                 (PolyType id)
112   | ArithSeqIn                  -- arithmetic sequence
113                 (ArithSeqInfo tyvar uvar id pat)
114   | ArithSeqOut
115                 (HsExpr       tyvar uvar id pat) -- (typechecked, of course)
116                 (ArithSeqInfo tyvar uvar id pat)
117
118   | CCall       FAST_STRING     -- call into the C world; string is
119                 [HsExpr tyvar uvar id pat]      -- the C function; exprs are the
120                                 -- arguments to pass.
121                 Bool            -- True <=> might cause Haskell
122                                 -- garbage-collection (must generate
123                                 -- more paranoid code)
124                 Bool            -- True <=> it's really a "casm"
125                                 -- NOTE: this CCall is the *boxed*
126                                 -- version; the desugarer will convert
127                                 -- it into the unboxed "ccall#".
128                 (GenType tyvar uvar)    -- The result type; will be *bottom*
129                                 -- until the typechecker gets ahold of it
130
131   | HsSCC       FAST_STRING     -- "set cost centre" (_scc_) annotation
132                 (HsExpr tyvar uvar id pat) -- expr whose cost is to be measured
133 \end{code}
134
135 Everything from here on appears only in typechecker output.
136
137 \begin{code}
138   | TyLam                       -- TRANSLATION
139                 [tyvar]
140                 (HsExpr tyvar uvar id pat)
141   | TyApp                       -- TRANSLATION
142                 (HsExpr  tyvar uvar id pat) -- generated by Spec
143                 [GenType tyvar uvar]
144
145   -- DictLam and DictApp are "inverses"
146   |  DictLam
147                 [id]
148                 (HsExpr tyvar uvar id pat)
149   |  DictApp
150                 (HsExpr tyvar uvar id pat)
151                 [id]
152
153   -- ClassDictLam and Dictionary are "inverses" (see note below)
154   |  ClassDictLam
155                 [id]            -- superclass dicts
156                 [id]            -- methods
157                 (HsExpr tyvar uvar id pat)
158   |  Dictionary
159                 [id]            -- superclass dicts
160                 [id]            -- methods
161
162   |  SingleDict                 -- a simple special case of Dictionary
163                 id              -- local dictionary name
164
165 type HsRecordBinds tyvar uvar id pat
166   = [(id, HsExpr tyvar uvar id pat, Bool)]
167         -- True <=> source code used "punning",
168         -- i.e. {op1, op2} rather than {op1=e1, op2=e2}
169 \end{code}
170
171 A @Dictionary@, unless of length 0 or 1, becomes a tuple.  A
172 @ClassDictLam dictvars methods expr@ is, therefore:
173 \begin{verbatim}
174 \ x -> case x of ( dictvars-and-methods-tuple ) -> expr
175 \end{verbatim}
176
177 \begin{code}
178 instance (NamedThing id, Outputable id, Outputable pat,
179           Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
180                 Outputable (HsExpr tyvar uvar id pat) where
181     ppr = pprExpr
182 \end{code}
183
184 \begin{code}
185 pprExpr sty (HsVar v)
186   = (if (isOpLexeme v) then ppParens else id) (ppr sty v)
187
188 pprExpr sty (HsLit    lit)   = ppr sty lit
189 pprExpr sty (HsLitOut lit _) = ppr sty lit
190
191 pprExpr sty (HsLam match)
192   = ppCat [ppStr "\\", ppNest 2 (pprMatch sty True match)]
193
194 pprExpr sty expr@(HsApp e1 e2)
195   = let (fun, args) = collect_args expr [] in
196     ppHang (pprParendExpr sty fun) 4 (ppSep (map (pprParendExpr sty) args))
197   where
198     collect_args (HsApp fun arg) args = collect_args fun (arg:args)
199     collect_args fun             args = (fun, args)
200
201 pprExpr sty (OpApp e1 op e2)
202   = case op of
203       HsVar v -> pp_infixly v
204       _       -> pp_prefixly
205   where
206     pp_e1 = pprParendExpr sty e1
207     pp_e2 = pprParendExpr sty e2
208
209     pp_prefixly
210       = ppHang (pprParendExpr sty op) 4 (ppSep [pp_e1, pp_e2])
211
212     pp_infixly v
213       = ppSep [pp_e1, ppCat [pprOp sty v, pp_e2]]
214
215 pprExpr sty (SectionL expr op)
216   = case op of
217       HsVar v -> pp_infixly v
218       _       -> pp_prefixly
219   where
220     pp_expr = pprParendExpr sty expr
221
222     pp_prefixly = ppHang (ppCat [ppStr "( \\ _x ->", ppr sty op])
223                        4 (ppCat [pp_expr, ppStr "_x )"])
224     pp_infixly v
225       = ppSep [ ppBeside ppLparen pp_expr,
226                 ppBeside (pprOp sty v) ppRparen ]
227
228 pprExpr sty (SectionR op expr)
229   = case op of
230       HsVar v -> pp_infixly v
231       _       -> pp_prefixly
232   where
233     pp_expr = pprParendExpr sty expr
234
235     pp_prefixly = ppHang (ppCat [ppStr "( \\ _x ->", ppr sty op, ppPStr SLIT("_x")])
236                        4 (ppBeside pp_expr ppRparen)
237     pp_infixly v
238       = ppSep [ ppBeside ppLparen (pprOp sty v),
239                 ppBeside pp_expr  ppRparen ]
240
241 pprExpr sty (CCall fun args _ is_asm result_ty)
242   = ppHang (if is_asm
243             then ppBesides [ppStr "_casm_ ``", ppPStr fun, ppStr "''"]
244             else ppBeside  (ppPStr SLIT("_ccall_ ")) (ppPStr fun))
245          4 (ppSep (map (pprParendExpr sty) args))
246
247 pprExpr sty (HsSCC label expr)
248   = ppSep [ ppBeside (ppPStr SLIT("_scc_ ")) (ppBesides [ppChar '"', ppPStr label, ppChar '"']),
249             pprParendExpr sty expr ]
250
251 pprExpr sty (HsCase expr matches _)
252   = ppSep [ ppSep [ppPStr SLIT("case"), ppNest 4 (pprExpr sty expr), ppPStr SLIT("of")],
253             ppNest 2 (pprMatches sty (True, ppNil) matches) ]
254
255 pprExpr sty (ListComp expr quals)
256   = ppHang (ppCat [ppLbrack, pprExpr sty expr, ppChar '|'])
257          4 (ppSep [interpp'SP sty quals, ppRbrack])
258
259 -- special case: let ... in let ...
260 pprExpr sty (HsLet binds expr@(HsLet _ _))
261   = ppSep [ppHang (ppPStr SLIT("let")) 2 (ppCat [ppr sty binds, ppPStr SLIT("in")]),
262            ppr sty expr]
263
264 pprExpr sty (HsLet binds expr)
265   = ppSep [ppHang (ppPStr SLIT("let")) 2 (ppr sty binds),
266            ppHang (ppPStr SLIT("in"))  2 (ppr sty expr)]
267
268 pprExpr sty (HsDo stmts _)
269   = ppCat [ppPStr SLIT("do"), ppAboves (map (ppr sty) stmts)]
270
271 pprExpr sty (HsIf e1 e2 e3 _)
272   = ppSep [ppCat [ppPStr SLIT("if"), ppNest 2 (pprExpr sty e1), ppPStr SLIT("then")],
273            ppNest 4 (pprExpr sty e2),
274            ppPStr SLIT("else"),
275            ppNest 4 (pprExpr sty e3)]
276
277 pprExpr sty (ExplicitList exprs)
278   = ppBracket (ppInterleave ppComma (map (pprExpr sty) exprs))
279 pprExpr sty (ExplicitListOut ty exprs)
280   = ppBesides [ ppBracket (ppInterleave ppComma (map (pprExpr sty) exprs)),
281                 ifnotPprForUser sty (ppBeside ppSP (ppParens (pprGenType sty ty))) ]
282
283 pprExpr sty (ExplicitTuple exprs)
284   = ppParens (ppInterleave ppComma (map (pprExpr sty) exprs))
285 pprExpr sty (ExprWithTySig expr sig)
286   = ppHang (ppBesides [ppLparen, ppNest 2 (pprExpr sty expr), ppPStr SLIT(" ::")])
287          4 (ppBeside  (ppr sty sig) ppRparen)
288
289 pprExpr sty (RecordCon con  rbinds)
290   = pp_rbinds sty (ppr sty con) rbinds
291
292 pprExpr sty (RecordUpd aexp rbinds)
293   = pp_rbinds sty (pprParendExpr sty aexp) rbinds
294
295 pprExpr sty (ArithSeqIn info)
296   = ppBracket (ppr sty info)
297 pprExpr sty (ArithSeqOut expr info)
298   = case sty of
299         PprForUser ->
300           ppBracket (ppr sty info)
301         _          ->
302           ppBesides [ppLbrack, ppParens (ppr sty expr), ppr sty info, ppRbrack]
303
304 pprExpr sty (TyLam tyvars expr)
305   = ppHang (ppCat [ppStr "/\\", interppSP sty tyvars, ppStr "->"])
306          4 (pprExpr sty expr)
307
308 pprExpr sty (TyApp expr [ty])
309   = ppHang (pprExpr sty expr) 4 (pprParendGenType sty ty)
310
311 pprExpr sty (TyApp expr tys)
312   = ppHang (pprExpr sty expr)
313          4 (ppBracket (interpp'SP sty tys))
314
315 pprExpr sty (DictLam dictvars expr)
316   = ppHang (ppCat [ppStr "\\{-dict-}", interppSP sty dictvars, ppStr "->"])
317          4 (pprExpr sty expr)
318
319 pprExpr sty (DictApp expr [dname])
320   = ppHang (pprExpr sty expr) 4 (ppr sty dname)
321
322 pprExpr sty (DictApp expr dnames)
323   = ppHang (pprExpr sty expr)
324          4 (ppBracket (interpp'SP sty dnames))
325
326 pprExpr sty (ClassDictLam dicts methods expr)
327   = ppHang (ppCat [ppStr "\\{-classdict-}",
328                    ppBracket (interppSP sty dicts),
329                    ppBracket (interppSP sty methods),
330                    ppStr "->"])
331          4 (pprExpr sty expr)
332
333 pprExpr sty (Dictionary dicts methods)
334  = ppSep [ppBesides [ppLparen, ppPStr SLIT("{-dict-}")],
335           ppBracket (interpp'SP sty dicts),
336           ppBesides [ppBracket (interpp'SP sty methods), ppRparen]]
337
338 pprExpr sty (SingleDict dname)
339  = ppCat [ppPStr SLIT("{-singleDict-}"), ppr sty dname]
340 \end{code}
341
342 Parenthesize unless very simple:
343 \begin{code}
344 pprParendExpr :: (NamedThing id, Outputable id, Outputable pat,
345                   Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
346               => PprStyle -> HsExpr tyvar uvar id pat -> Pretty
347
348 pprParendExpr sty expr
349   = let
350         pp_as_was = pprExpr sty expr
351     in
352     case expr of
353       HsLit l               -> ppr sty l
354       HsLitOut l _          -> ppr sty l
355       HsVar _               -> pp_as_was
356       ExplicitList _        -> pp_as_was
357       ExplicitListOut _ _   -> pp_as_was
358       ExplicitTuple _       -> pp_as_was
359       _                     -> ppParens pp_as_was
360 \end{code}
361
362 %************************************************************************
363 %*                                                                      *
364 \subsection{Record binds}
365 %*                                                                      *
366 %************************************************************************
367
368 \begin{code}
369 pp_rbinds :: (NamedThing id, Outputable id, Outputable pat,
370                   Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar)
371               => PprStyle -> Pretty 
372               -> HsRecordBinds tyvar uvar id pat -> Pretty
373
374 pp_rbinds sty thing rbinds
375   = ppHang thing 4
376         (ppBesides [ppChar '{', ppInterleave ppComma (map (pp_rbind sty) rbinds), ppChar '}'])
377   where
378     pp_rbind sty (v, _, True{-pun-}) = ppr sty v
379     pp_rbind sty (v, e, _) = ppCat [ppr sty v, ppStr "<-", ppr sty e]
380 \end{code}
381
382 %************************************************************************
383 %*                                                                      *
384 \subsection{Do stmts}
385 %*                                                                      *
386 %************************************************************************
387
388 \begin{code}
389 data Stmt tyvar uvar id pat
390   = BindStmt    pat
391                 (HsExpr  tyvar uvar id pat)
392                 SrcLoc
393   | ExprStmt    (HsExpr  tyvar uvar id pat)
394                 SrcLoc
395   | LetStmt     (HsBinds tyvar uvar id pat)
396 \end{code}
397
398 \begin{code}
399 instance (NamedThing id, Outputable id, Outputable pat,
400           Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
401                 Outputable (Stmt tyvar uvar id pat) where
402     ppr sty (BindStmt pat expr _)
403      = ppCat [ppr sty pat, ppStr "<-", ppr sty expr]
404     ppr sty (LetStmt binds)
405      = ppCat [ppPStr SLIT("let"), ppr sty binds]
406     ppr sty (ExprStmt expr _)
407      = ppr sty expr
408 \end{code}
409
410 %************************************************************************
411 %*                                                                      *
412 \subsection{Enumerations and list comprehensions}
413 %*                                                                      *
414 %************************************************************************
415
416 \begin{code}
417 data ArithSeqInfo  tyvar uvar id pat
418   = From            (HsExpr tyvar uvar id pat)
419   | FromThen        (HsExpr tyvar uvar id pat)
420                     (HsExpr tyvar uvar id pat)
421   | FromTo          (HsExpr tyvar uvar id pat)
422                     (HsExpr tyvar uvar id pat)
423   | FromThenTo      (HsExpr tyvar uvar id pat)
424                     (HsExpr tyvar uvar id pat)
425                     (HsExpr tyvar uvar id pat)
426 \end{code}
427
428 \begin{code}
429 instance (NamedThing id, Outputable id, Outputable pat,
430           Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
431                 Outputable (ArithSeqInfo tyvar uvar id pat) where
432     ppr sty (From e1)           = ppBesides [ppr sty e1, pp_dotdot]
433     ppr sty (FromThen e1 e2)    = ppBesides [ppr sty e1, pp'SP, ppr sty e2, pp_dotdot]
434     ppr sty (FromTo e1 e3)      = ppBesides [ppr sty e1, pp_dotdot, ppr sty e3]
435     ppr sty (FromThenTo e1 e2 e3)
436       = ppBesides [ppr sty e1, pp'SP, ppr sty e2, pp_dotdot, ppr sty e3]
437
438 pp_dotdot = ppPStr SLIT(" .. ")
439 \end{code}
440
441 ``Qualifiers'' in list comprehensions:
442 \begin{code}
443 data Qual tyvar uvar id pat
444   = GeneratorQual   pat
445                     (HsExpr  tyvar uvar id pat)
446   | LetQual         (HsBinds tyvar uvar id pat)
447   | FilterQual      (HsExpr  tyvar uvar id pat)
448 \end{code}
449
450 \begin{code}
451 instance (NamedThing id, Outputable id, Outputable pat,
452           Eq tyvar, Outputable tyvar, Eq uvar, Outputable uvar) =>
453                 Outputable (Qual tyvar uvar id pat) where
454     ppr sty (GeneratorQual pat expr)
455      = ppCat [ppr sty pat, ppStr "<-", ppr sty expr]
456     ppr sty (LetQual binds)
457      = ppCat [ppPStr SLIT("let"), ppr sty binds]
458     ppr sty (FilterQual expr)
459      = ppr sty expr
460 \end{code}