6 struct subst
*subst_id()
8 struct subst
*res
= safe_malloc(sizeof(struct subst
));
15 struct subst
*subst_singleton(char *ident
, struct type
*t
)
17 struct subst
*res
= safe_malloc(sizeof(struct subst
));
19 res
->vars
= safe_malloc(sizeof(char *));
20 res
->vars
[0] = safe_strdup(ident
);
21 res
->types
= safe_malloc(sizeof(struct type
*));
22 res
->types
[0] = type_dup(t
);
26 struct subst
*subst_union(struct subst
*l
, struct subst
*r
)
28 if (l
== NULL
|| r
== NULL
)
30 struct subst
*res
= safe_malloc(sizeof(struct subst
));
31 res
->nvar
= l
->nvar
+r
->nvar
;
32 res
->vars
= safe_malloc(res
->nvar
*sizeof(char *));
33 res
->types
= safe_malloc(res
->nvar
*sizeof(struct type
*));
34 for (int i
= 0; i
<l
->nvar
; i
++) {
35 res
->vars
[i
] = l
->vars
[i
];
36 res
->types
[i
] = l
->types
[i
];
38 for (int i
= 0; i
<r
->nvar
; i
++) {
39 res
->vars
[l
->nvar
+i
] = r
->vars
[i
];
40 res
->types
[l
->nvar
+i
] = subst_apply_t(l
, r
->types
[i
]);
45 struct type
*subst_apply_t(struct subst
*subst
, struct type
*l
)
51 l
->data
.tarrow
.l
= subst_apply_t(subst
, l
->data
.tarrow
.l
);
52 l
->data
.tarrow
.r
= subst_apply_t(subst
, l
->data
.tarrow
.r
);
57 l
->data
.tlist
= subst_apply_t(subst
, l
->data
.tlist
);
60 l
->data
.ttuple
.l
= subst_apply_t(subst
, l
->data
.ttuple
.l
);
61 l
->data
.ttuple
.r
= subst_apply_t(subst
, l
->data
.ttuple
.r
);
64 for (int i
= 0; i
<subst
->nvar
; i
++) {
65 if (strcmp(subst
->vars
[i
], l
->data
.tvar
) == 0) {
67 struct type
*r
= type_dup(subst
->types
[i
]);
78 struct scheme
*subst_apply_s(struct subst
*subst
, struct scheme
*scheme
)
80 for (int i
= 0; i
<scheme
->nvar
; i
++) {
81 for (int j
= 0; j
<subst
->nvar
; j
++) {
82 if (strcmp(scheme
->var
[i
], subst
->vars
[j
]) != 0) {
83 struct subst
*t
= subst_singleton(
84 subst
->vars
[j
], subst
->types
[j
]);
85 scheme
->type
= subst_apply_t(t
, scheme
->type
);
92 struct gamma
*subst_apply_g(struct subst
*subst
, struct gamma
*gamma
)
94 for (int i
= 0; i
<gamma
->nschemes
; i
++)
95 subst_apply_s(subst
, gamma
->schemes
[i
]);
99 void subst_print(struct subst
*s
, FILE *out
)
102 fprintf(out
, "no subst\n");
105 for (int i
= 0; i
<s
->nvar
; i
++) {
106 fprintf(out
, "%s->", s
->vars
[i
]);
107 type_print(s
->types
[i
], out
);
115 void subst_free(struct subst
*s
, bool type
)
118 for (int i
= 0; i
<s
->nvar
; i
++) {
121 type_free(s
->types
[i
]);