summaryrefslogtreecommitdiff
path: root/compiler/coreSyn/ExternalCore.lhs
blob: ecc24b1155838c229aed6f2c0c56010f1c3be5d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
%
% (c) The University of Glasgow 2001-2006
%
\begin{code}
module ExternalCore where

import Data.Word

data Module
 = Module Mname [Tdef] [Vdefg]

data Tdef
  = Data (Qual Tcon) [Tbind] [Cdef]
  | Newtype (Qual Tcon) (Qual Tcon) [Tbind] Ty

data Cdef
  = Constr (Qual Dcon) [Tbind] [Ty]
  | GadtConstr (Qual Dcon) Ty

data Vdefg
  = Rec [Vdef]
  | Nonrec Vdef

-- Top-level bindings are qualified, so that the printer doesn't have to pass
-- around the module name.
type Vdef = (Bool,Qual Var,Ty,Exp)

data Exp
  = Var (Qual Var)
  | Dcon (Qual Dcon)
  | Lit Lit
  | App Exp Exp
  | Appt Exp Ty
  | Lam Bind Exp
  | Let Vdefg Exp
  | Case Exp Vbind Ty [Alt] {- non-empty list -}
  | Cast Exp Coercion
  | Tick String Exp {- XXX probably wrong -}
  | External String String Ty {- target name, convention, and type -}
  | DynExternal String Ty {- convention and type (incl. Addr# of target as first arg) -}
  | Label String

data Bind
  = Vb Vbind
  | Tb Tbind

data Alt
  = Acon (Qual Dcon) [Tbind] [Vbind] Exp
  | Alit Lit Exp
  | Adefault Exp

type Vbind = (Var,Ty)
type Tbind = (Tvar,Kind)

data Ty
  = Tvar Tvar
  | Tcon (Qual Tcon)
  | Tapp Ty Ty
  | Tforall Tbind Ty

data Coercion
-- We distinguish primitive coercions because External Core treats
-- them specially, so we have to print them out with special syntax.
  = ReflCoercion Role Ty
  | SymCoercion Coercion
  | TransCoercion Coercion Coercion
  | TyConAppCoercion Role (Qual Tcon) [Coercion]
  | AppCoercion Coercion Coercion
  | ForAllCoercion Tbind Coercion
  | CoVarCoercion Var
  | UnivCoercion Role Ty Ty
  | InstCoercion Coercion Ty
  | NthCoercion Int Coercion
  | AxiomCoercion (Qual Tcon) Int [Coercion]
  | LRCoercion LeftOrRight Coercion
  | SubCoercion Coercion

data Role = Nominal | Representational | Phantom

data LeftOrRight = CLeft | CRight

data Kind
  = Klifted
  | Kunlifted
  | Kunboxed
  | Kopen
  | Karrow Kind Kind

data Lit
  = Lint Integer Ty
  | Lrational Rational Ty
  | Lchar Char Ty
  | Lstring [Word8] Ty


type Mname = Id
type Var = Id
type Tvar = Id
type Tcon = Id
type Dcon = Id

type Qual t = (Mname,t)

type Id = String

primMname :: Mname
-- For truly horrible reasons, this must be z-encoded.
-- With any hope, the z-encoding will die soon.
primMname = "ghczmprim:GHCziPrim"

tcArrow :: Qual Tcon
tcArrow = (primMname, "(->)")

\end{code}