[project @ 1998-02-03 17:13:54 by simonm]
[ghc-hetmet.git] / ghc / compiler / hsSyn / HsCore.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1996
3 %
4 %************************************************************************
5 %*                                                                      *
6 \section[HsCore]{Core-syntax unfoldings in Haskell interface files}
7 %*                                                                      *
8 %************************************************************************
9
10 We could either use this, or parameterise @GenCoreExpr@ on @Types@ and
11 @TyVars@ as well.  Currently trying the former... MEGA SIGH.
12
13 \begin{code}
14 module HsCore (
15         UfExpr(..), UfAlts(..), UfBinder(..), UfCoercion(..),
16         UfDefault(..), UfBinding(..),
17         UfArg(..), UfPrimOp(..)
18     ) where
19
20 #include "HsVersions.h"
21
22 -- friends:
23 import HsTypes          ( HsType, pprParendHsType )
24 import Kind             ( Kind {- instance Outputable -} )
25
26 -- others:
27 import Literal          ( Literal )
28 import Util             ( panic )
29 import CostCentre
30 import Outputable
31 \end{code}
32
33 %************************************************************************
34 %*                                                                      *
35 \subsection[HsCore-types]{Types for read/written Core unfoldings}
36 %*                                                                      *
37 %************************************************************************
38
39 \begin{code}
40 data UfExpr name
41   = UfVar       name
42   | UfLit       Literal
43   | UfCon       name [UfArg name]
44   | UfPrim      (UfPrimOp name) [UfArg name]
45   | UfLam       (UfBinder name)   (UfExpr name)
46   | UfApp       (UfExpr name) (UfArg name)
47   | UfCase      (UfExpr name) (UfAlts name)
48   | UfLet       (UfBinding name)  (UfExpr name)
49   | UfSCC       CostCentre (UfExpr name)
50   | UfCoerce    (UfCoercion name) (HsType name) (UfExpr name)
51
52 data UfPrimOp name
53   = UfCCallOp   FAST_STRING          -- callee
54                 Bool                 -- True <=> casm, rather than ccall
55                 Bool                 -- True <=> might cause GC
56                 [HsType name] -- arg types, incl state token
57                                      -- (which will be first)
58                 (HsType name) -- return type
59
60   | UfOtherOp   name
61
62 data UfCoercion name = UfIn name | UfOut name
63
64 data UfAlts name
65   = UfAlgAlts  [(name, [name], UfExpr name)]
66                 (UfDefault name)
67   | UfPrimAlts [(Literal, UfExpr name)]
68                 (UfDefault name)
69
70 data UfDefault name
71   = UfNoDefault
72   | UfBindDefault name (UfExpr name)
73
74 data UfBinding name
75   = UfNonRec    (UfBinder name)
76                 (UfExpr name)
77   | UfRec       [(UfBinder name, UfExpr name)]
78
79 data UfBinder name
80   = UfValBinder name (HsType name)
81   | UfTyBinder  name Kind
82
83 data UfArg name
84   = UfVarArg    name
85   | UfLitArg    Literal
86   | UfTyArg     (HsType name)
87 \end{code}
88
89 %************************************************************************
90 %*                                                                      *
91 \subsection[HsCore-print]{Printing Core unfoldings}
92 %*                                                                      *
93 %************************************************************************
94
95 \begin{code}
96 instance Outputable name => Outputable (UfExpr name) where
97     ppr (UfVar v) = ppr v
98     ppr (UfLit l) = ppr l
99
100     ppr (UfCon c as)
101       = hsep [text "UfCon", ppr c, ppr as, char ')']
102     ppr (UfPrim o as)
103       = hsep [text "UfPrim", ppr o, ppr as, char ')']
104
105     ppr (UfLam b body)
106       = hsep [char '\\', ppr b, ptext SLIT("->"), ppr body]
107
108     ppr (UfApp fun (UfTyArg ty))
109       = hsep [ppr fun, char '@', pprParendHsType ty]
110
111     ppr (UfApp fun (UfLitArg lit))
112       = hsep [ppr fun, ppr lit]
113
114     ppr (UfApp fun (UfVarArg var))
115       = hsep [ppr fun, ppr var]
116
117     ppr (UfCase scrut alts)
118       = hsep [ptext SLIT("case"), ppr scrut, ptext SLIT("of {"), pp_alts alts, char '}']
119       where
120         pp_alts (UfAlgAlts alts deflt)
121           = hsep [hsep (punctuate semi (map pp_alt alts)), pp_deflt deflt]
122           where
123            pp_alt (c,bs,rhs) = hsep [ppr c, ppr bs, ppr_arrow, ppr rhs]
124         pp_alts (UfPrimAlts alts deflt)
125           = hsep [hsep (punctuate semi (map pp_alt alts)), pp_deflt deflt]
126           where
127            pp_alt (l,rhs) = hsep [ppr l, ppr_arrow, ppr rhs]
128
129         pp_deflt UfNoDefault = empty
130         pp_deflt (UfBindDefault b rhs) = hsep [ppr b, ppr_arrow, ppr rhs]
131
132         ppr_arrow = ptext SLIT("->")
133
134     ppr (UfLet (UfNonRec b rhs) body)
135       = hsep [ptext SLIT("let"), ppr b, equals, ppr rhs, ptext SLIT("in"), ppr body]
136     ppr (UfLet (UfRec pairs) body)
137       = hsep [ptext SLIT("letrec"), braces (hsep (punctuate semi (map pp_pair pairs))), ptext SLIT("in"), ppr body]
138       where
139         pp_pair (b,rhs) = hsep [ppr b, equals, ppr rhs]
140
141     ppr (UfSCC uf_cc body)
142       = hsep [ptext SLIT("_scc_ <cost-centre[ToDo]>"), ppr body]
143
144 instance Outputable name => Outputable (UfPrimOp name) where
145     ppr (UfCCallOp str is_casm can_gc arg_tys result_ty)
146       = let
147             before = ptext (if is_casm then SLIT("_casm_ ``") else SLIT("_ccall_ "))
148             after  = if is_casm then text "'' " else space
149         in
150         hcat [before, ptext str, after,
151                    brackets (ppr arg_tys), space, ppr result_ty]
152
153     ppr (UfOtherOp op)
154       = ppr op
155
156 instance Outputable name => Outputable (UfArg name) where
157     ppr (UfVarArg v)    = ppr v
158     ppr (UfLitArg l)    = ppr l
159     ppr (UfTyArg ty)    = pprParendHsType ty
160
161 instance Outputable name => Outputable (UfBinder name) where
162     ppr (UfValBinder name ty)  = hsep [ppr name, ptext SLIT("::"), ppr ty]
163     ppr (UfTyBinder name kind) = hsep [ppr name, ptext SLIT("::"), ppr kind]
164 \end{code}
165