Do the first round of revisions on part 3

This commit is contained in:
Danila Fedorin 2019-08-26 17:08:05 -07:00
parent 802e551ff4
commit 7e98477450

View File

@ -28,28 +28,22 @@ type_ptr ast_binop::typecheck(type_mgr& mgr, const type_env& env) const {
type_ptr ftype = env.lookup(op_name(op)); type_ptr ftype = env.lookup(op_name(op));
if(!ftype) throw 0; if(!ftype) throw 0;
type_ptr place_a = mgr.new_type(); type_ptr return_type = mgr.new_type();
type_ptr place_b = mgr.new_type(); type_ptr arrow_one = type_ptr(new type_arr(rtype, return_type));
type_ptr place_c = mgr.new_type(); type_ptr arrow_two = type_ptr(new type_arr(ltype, arrow_one));
type_ptr arrow_one = type_ptr(new type_arr(place_b, place_c));
type_ptr arrow_two = type_ptr(new type_arr(place_a, arrow_one));
mgr.unify(arrow_two, ftype); mgr.unify(arrow_two, ftype);
mgr.unify(place_a, ltype); return return_type;
mgr.unify(place_b, rtype);
return place_c;
} }
type_ptr ast_app::typecheck(type_mgr& mgr, const type_env& env) const { type_ptr ast_app::typecheck(type_mgr& mgr, const type_env& env) const {
type_ptr ltype = left->typecheck(mgr, env); type_ptr ltype = left->typecheck(mgr, env);
type_ptr rtype = right->typecheck(mgr, env); type_ptr rtype = right->typecheck(mgr, env);
type_ptr place_a = mgr.new_type(); type_ptr return_type = mgr.new_type();
type_ptr place_b = mgr.new_type(); type_ptr arrow = type_ptr(new type_arr(rtype, return_type));
type_ptr arrow = type_ptr(new type_arr(place_a, place_b));
mgr.unify(arrow, ltype); mgr.unify(arrow, ltype);
mgr.unify(place_a, rtype); return return_type;
return place_b;
} }
type_ptr ast_case::typecheck(type_mgr& mgr, const type_env& env) const { type_ptr ast_case::typecheck(type_mgr& mgr, const type_env& env) const {