coreSyn/ExternalCore.lhs

% % (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}