9 void type_error(const char *msg
, ...)
13 fprintf(stderr
, "type error: ");
14 vfprintf(stderr
, msg
, ap
);
19 void check_expr_constant(struct expr
*expr
)
23 check_expr_constant(expr
->data
.ebinop
.l
);
24 check_expr_constant(expr
->data
.ebinop
.r
);
27 check_expr_constant(expr
->data
.eunop
.l
);
31 type_error("Initialiser is not constant\n");
38 struct vardecl
*type_vardecl(struct gamma
*gamma
, struct vardecl
*vardecl
)
40 struct type
*t
= vardecl
->type
== NULL
41 ? gamma_fresh(gamma
) : type_dup(vardecl
->type
);
42 struct subst
*s
= infer_expr(gamma
, vardecl
->expr
, t
);
45 die("error inferring variable\n");
46 vardecl
->type
= subst_apply_t(s
, t
);
53 struct ast
*sem(struct ast
*ast
)
57 struct gamma
*gamma
= gamma_init();
60 for (int i
= 0; i
<ast
->ndecls
; i
++) {
61 switch(ast
->decls
[i
]->type
) {
64 check_expr_constant(ast
->decls
[i
]->data
.dvar
->expr
);
66 type_vardecl(gamma
, ast
->decls
[i
]->data
.dvar
);
69 // struct type *f1 = gamma_fresh(gamma);
70 // gamma_insert(gamma, ast->decls[i]->data.dfun->ident
71 // , scheme_create(f1));
72 //infer env (Let [(x, e1)] e2)
74 // >>= \tv-> let env` = 'Data.Map'.put x (Forall [] tv) env
76 // >>= \(s1,t1)-> infer ('Data.Map'.put x (generalize (apply s1 env`) t1) env`) e2
77 // >>= \(s2, t2)->pure (s1 oo s2, t2)