[project @ 2001-06-01 17:14:07 by apt]
[ghc-hetmet.git] / ghc / compiler / coreSyn / ExternalCore.lhs
1 %
2 % (c) The University of Glasgow 2001
3 %
4 \begin{code}
5
6 module ExternalCore where
7
8 import List (elemIndex)
9
10 data Module 
11  = Module Mname [Tdef] [(Bool,Vdefg)]
12
13 data Tdef 
14   = Data Tcon [Tbind] [Cdef]
15   | Newtype Tcon [Tbind] Ty
16
17 data Cdef 
18   = Constr Dcon [Tbind] [Ty]
19
20 data Vdefg 
21   = Rec [Vdef]
22   | Nonrec Vdef
23
24 type Vdef = (Var,Ty,Exp) 
25
26 data Exp 
27   = Var (Qual Var)
28   | Dcon (Qual Dcon)
29   | Lit Lit
30   | App Exp Exp
31   | Appt Exp Ty
32   | Lam Bind Exp          
33   | Let Vdefg Exp
34   | Case Exp Vbind [Alt] {- non-empty list -}
35   | Coerce Ty Exp 
36   | Note String Exp
37   | Ccall String Ty
38
39 data Bind 
40   = Vb Vbind
41   | Tb Tbind
42
43 data Alt 
44   = Acon (Qual Dcon) [Tbind] [Vbind] Exp
45   | Alit Lit Exp
46   | Adefault Exp
47
48 type Vbind = (Var,Ty)
49 type Tbind = (Tvar,Kind)
50
51 data Ty 
52   = Tvar Tvar
53   | Tcon (Qual Tcon)
54   | Tapp Ty Ty
55   | Tforall Tbind Ty 
56
57 data Kind 
58   = Klifted
59   | Kunlifted
60   | Kopen
61   | Karrow Kind Kind
62   deriving (Eq)
63
64 data Lit 
65   = Lint Integer Ty
66   | Lrational Rational Ty
67   | Lchar Char Ty
68   | Lstring String Ty
69  deriving (Eq)
70   
71
72 type Mname = Id
73 type Var = Id
74 type Tvar = Id
75 type Tcon = Id
76 type Dcon = Id
77
78 type Qual t = (Mname,t)
79
80 type Id = String
81
82 equalTy t1 t2 =  eqTy [] [] t1 t2 
83   where eqTy e1 e2 (Tvar v1) (Tvar v2) =
84              case (elemIndex v1 e1,elemIndex v2 e2) of
85                (Just i1, Just i2) -> i1 == i2
86                (Nothing, Nothing)  -> v1 == v2
87                _ -> False
88         eqTy e1 e2 (Tcon c1) (Tcon c2) = c1 == c2
89         eqTy e1 e2 (Tapp t1a t1b) (Tapp t2a t2b) =
90               eqTy e1 e2 t1a t2a && eqTy e1 e2 t1b t2b
91         eqTy e1 e2 (Tforall (tv1,tk1) t1) (Tforall (tv2,tk2) t2) =
92               tk1 == tk2 && eqTy (tv1:e1) (tv2:e2) t1 t2 
93         eqTy _ _ _ _ = False
94
95 instance Eq Ty where (==) = equalTy
96
97 subKindOf :: Kind -> Kind -> Bool
98 _ `subKindOf` Kopen = True
99 k1 `subKindOf` k2 = k1 == k2  -- don't worry about higher kinds
100
101 instance Ord Kind where (<=) = subKindOf
102
103 primMname = "PrelGHC"
104
105 tcArrow :: Qual Tcon
106 tcArrow = (primMname, "ZLzmzgZR")
107
108 \end{code}
109
110
111
112