[project @ 1999-02-03 17:08:25 by sewardj]
[ghc-hetmet.git] / ghc / interpreter / subst.h
1
2 /* --------------------------------------------------------------------------
3  * Definitions for substitution data structure and operations.
4  *
5  * Hugs 98 is Copyright (c) Mark P Jones, Alastair Reid and the Yale
6  * Haskell Group 1994-99, and is distributed as Open Source software
7  * under the Artistic License; see the file "Artistic" that is included
8  * in the distribution for details.
9  *
10  * $RCSfile: subst.h,v $
11  * $Revision: 1.3 $
12  * $Date: 1999/02/03 17:08:43 $
13  * ------------------------------------------------------------------------*/
14
15 typedef struct {                        /* Each type variable contains:    */
16     Type bound;                         /* A type skeleton (unbound==NIL)  */
17     Int  offs;                          /* Offset for skeleton             */
18     Kind kind;                          /* kind annotation                 */
19 } Tyvar;
20
21 #if     FIXED_SUBST                     /* storage for type variables      */
22 extern  Tyvar           tyvars[];
23 #else
24 extern  Tyvar           *tyvars;        /* storage for type variables      */
25 #endif
26 extern  Int             typeOff;        /* offset of result type           */
27 extern  Type            typeIs;         /* skeleton of result type         */
28 extern  Int             typeFree;       /* freedom in instantiated type    */
29 extern  List            predsAre;       /* list of predicates in type      */
30 extern  List            genericVars;    /* list of generic vars            */
31 extern  List            btyvars;        /* explicitly scoped type vars     */
32
33 #define tyvar(n)        (tyvars+(n))    /* nth type variable               */
34 #define tyvNum(t)       ((t)-tyvars)    /* and the corresp. inverse funct. */
35 #define isBound(t)      (((t)->bound) && ((t)->bound!=SKOLEM))
36 #define aVar            mkOffset(0)     /* Simple skeletons for type vars  */
37 #define bVar            mkOffset(1)
38 #define enterBtyvs()    btyvars = cons(NIL,btyvars)
39 #define leaveBtyvs()    btyvars = tl(btyvars)
40
41 #define deRef(tyv,t,o)  while ((tyv=getTypeVar(t,o)) && isBound(tyv)) { \
42                             t = tyv->bound;                             \
43                             o = tyv->offs;                              \
44                         }
45
46                                         /* offs values when isNull(bound): */
47 #define FIXED_TYVAR     0               /* fixed in current assumption     */
48 #define UNUSED_GENERIC  1               /* not fixed, not yet encountered  */
49 #define GENERIC         2               /* GENERIC+n==nth generic var found*/
50
51 extern  char            *unifyFails;    /* Unification error message       */
52
53 extern Void  emptySubstitution  Args((Void));
54 extern Int   newTyvars          Args((Int));
55 #define      newKindvars(n)     newTyvars(n)
56 extern Int   newKindedVars      Args((Kind));
57 extern Void  instantiate        Args((Type));
58
59 extern Pair  findBtyvs          Args((Text));
60 extern Void  markBtyvs          Args((Void));
61 extern Type  localizeBtyvs      Args((Type));
62
63 extern Tyvar *getTypeVar        Args((Type,Int));
64 extern Void  tyvarType          Args((Int));
65 extern Void  bindTv             Args((Int,Type,Int));
66 extern Cell  getDerefHead       Args((Type,Int));
67 extern Void  expandSyn          Args((Tycon, Int, Type *, Int *));
68
69 extern Void  clearMarks         Args((Void));
70 extern Void  markAllVars        Args((Void));
71 extern Void  resetGenerics      Args((Void));
72 extern Void  markTyvar          Args((Int));
73 extern Void  markType           Args((Type,Int));
74 extern Void  markPred           Args((Cell));
75
76 extern Type  copyTyvar          Args((Int));
77 extern Type  copyType           Args((Type,Int));
78 extern Cell  copyPred           Args((Cell,Int));
79 extern Type  dropRank2          Args((Type,Int,Int));
80 extern Type  dropRank1          Args((Type,Int,Int));
81 extern Void  liftRank2Args      Args((List,Int,Int));
82 extern Type  liftRank2          Args((Type,Int,Int));
83 extern Type  liftRank1          Args((Type,Int,Int));
84 #ifdef DEBUG_TYPES
85 extern Type  debugTyvar         Args((Int));
86 extern Type  debugType          Args((Type,Int));
87 #endif
88 extern Kind  copyKindvar        Args((Int));
89 extern Kind  copyKind           Args((Kind,Int));
90
91 extern Bool  eqKind             Args((Kind,Kind));
92 extern Kind  getKind            Args((Cell,Int));
93
94 extern List  genvarTyvar        Args((Int,List));
95 extern List  genvarType         Args((Type,Int,List));
96
97 extern Bool  doesntOccurIn      Args((Tyvar*,Type,Int));
98 extern Bool  unify              Args((Type,Int,Type,Int));
99 extern Bool  kunify             Args((Kind,Int,Kind,Int));
100
101 extern Void  typeTuple          Args((Cell));
102 extern Kind  simpleKind         Args((Int));
103 extern Void  varKind            Args((Int));
104
105 extern Bool  samePred           Args((Cell,Int,Cell,Int));
106 extern Bool  matchPred          Args((Cell,Int,Cell,Int));
107 extern Bool  unifyPred          Args((Cell,Int,Cell,Int));
108 extern Inst  findInstFor        Args((Cell,Int));
109
110 extern Bool  sameSchemes        Args((Type,Type));
111
112 /*-------------------------------------------------------------------------*/