3 {- This module contains a few primitive types that need to be wired in.
4 Most are defined in PrimEnv, which is automatically generated from
7 module Language.Core.Prims(initialEnv, primEnv, newPrimVars) where
9 import Language.Core.Core
10 import Language.Core.Encoding
11 import Language.Core.Env
12 import Language.Core.Check
13 import Language.Core.PrimCoercions
14 import Language.Core.PrimEnv
17 initialEnv = efromlist [(primMname,primEnv),
21 primEnv = Envs {tcenv_=efromlist $ map (\ (t,k) -> (t,Kind k))
22 ([(snd $ tcUtuple n, ktUtuple n) | n <- [1..maxUtuple]]
23 ++ ((snd tcArrow,ktArrow):primTcs)),
24 cenv_=efromlist primDcs,
25 venv_=efromlist (newPrimVars ++ opsState ++ primVals)}
28 errorEnv = Envs {tcenv_=eempty,
30 venv_=efromlist errorVals}
33 newPrimVars :: [(Id, Ty)]
34 newPrimVars = map (\ (v, ty) -> (zEncodeString v, ty))
35 [("hPutChar#", mkFunTy tIntzh (mkFunTy tCharzh tIOUnit)),
36 ("isSpace#", mkFunTy tCharzh tBool)]
39 primDcs :: [(Dcon,Ty)]
40 primDcs = map (\ ((_,c),t) -> (c,t))
41 [(dcUtuple n, dcUtupleTy n) | n <- [1..maxUtuple]]
44 tRWS = tStatezh tRealWorld
46 opsState :: [(Var, Ty)]
48 ("realWorldzh", tRWS)]
50 {- Real world and state. -}
52 -- tjc: why isn't this one unboxed?
53 tcRealWorld :: Qual Tcon
54 tcRealWorld = pv "RealWorld"
56 tRealWorld = Tcon tcRealWorld
58 tcStatezh :: Qual Tcon
59 tcStatezh = pvz "State"
61 tStatezh t = Tapp (Tcon tcStatezh) t
63 {- Properly defined in PrelError, but needed in many modules before that. -}
64 errorVals :: [(Var, Ty)]
66 ("error", Tforall ("a",Kopen) (tArrow tString (Tvar "a"))),
67 ("irrefutPatError", str2A),
69 ("divZZeroError", forallAA),
70 ("overflowError", forallAA)]
72 {- Non-primitive, but mentioned in the types of primitives. -}
78 str2A = Tforall ("a",Kopen) (tArrow tAddrzh (Tvar "a"))
79 forallAA = Tforall ("a",Kopen) (Tvar "a")
82 tBool = Tcon (Just boolMname, "Bool")
90 tList t = Tapp (Tcon tcList) t
93 tIntzh, tCharzh, tIOUnit :: Ty
94 tIntzh = Tcon (primId "Int#")
95 tCharzh = Tcon (primId "Char#")
96 tIOUnit = Tapp (Tcon (Just (mkBaseMname "IOBase"), "IO"))
99 primId :: String -> Qual Id
100 primId = pv . zEncodeString