diff --git a/k.krak b/k.krak index 675ccb8..53d5229 100644 --- a/k.krak +++ b/k.krak @@ -213,7 +213,7 @@ fun main(argc: int, argv: **char): int { var unify: fun(*binding, *binding): void = fun(t1: *binding, t2: *binding) { println("trying to unify " + t1->bound_to->to_string() + " and " + t2->bound_to->to_string()) - if (t1->bound_to->equality(t2->bound_to, false) || t1->bound_to->is_unknown()) + if (t1->bound_to->equality(t2->bound_to, false, false) || t1->bound_to->is_unknown()) t1->set(t2->bound_to) else if (t2->bound_to->is_unknown()) t2->set(t1->bound_to) @@ -247,7 +247,7 @@ fun main(argc: int, argv: **char): int { match (t->data) { ast::_binding(b) if (!t->data._binding.second->bound()) { println("Attempting to use our inferenced type " + unbound_types[t]->bound_to->to_string() + " to decide what to bind " + to_string(t->data) + " to form options:") - var filtered_options = multiple_binding_options[t].filter(fun(p: *tree): bool return unbound_types[t]->bound_to->equality(get_type(p)->bound_to, false);) + var filtered_options = multiple_binding_options[t].filter(fun(p: *tree): bool return unbound_types[t]->bound_to->equality(get_type(p)->bound_to, false, true);) multiple_binding_options[t].for_each(fun(p: *tree) { println("\t" + to_string(p->data) + " of type " + get_type(p)->bound_to->to_string()) }) diff --git a/stdlib/type2.krak b/stdlib/type2.krak index 5c1d703..69a1d4d 100644 --- a/stdlib/type2.krak +++ b/stdlib/type2.krak @@ -55,10 +55,12 @@ obj type (Object) { fun destruct() { base.destruct() } - fun operator!=(other: ref type):bool return !equality(other, true); - fun operator==(other: ref type):bool return equality(other, true); - fun equality(other: *type, care_about_ref: bool):bool return equality(*other, care_about_ref); - fun equality(other: ref type, care_about_ref: bool):bool { + fun operator!=(other: ref type):bool return !equality(other, true, false); + fun operator==(other: ref type):bool return equality(other, true, false); + fun equality(other: *type, care_about_ref: bool, count_unknown_as_equal: bool):bool return equality(*other, care_about_ref, count_unknown_as_equal); + fun equality(other: ref type, care_about_ref: bool, count_unknown_as_equal: bool):bool { + if (count_unknown_as_equal && (is_unknown() || other.is_unknown())) + return true if (care_about_ref && (is_ref != other.is_ref)) return false if (indirection != other.indirection) @@ -67,12 +69,12 @@ obj type (Object) { base_type::_fun(b) { if ( !(other.is_fun() && base._fun.second == other.base._fun.second && base._fun.third == other.base._fun.third) ) return false - if ( !(base._fun.first.second->bound_to->equality(other.base._fun.first.second->bound_to, care_about_ref)) ) + if ( !(base._fun.first.second->bound_to->equality(other.base._fun.first.second->bound_to, care_about_ref, count_unknown_as_equal)) ) return false if ( !(base._fun.first.first.size == other.base._fun.first.first.size) ) return false for (var i = 0; i < base._fun.first.first.size; i++;) - if ( !(base._fun.first.first[i]->bound_to->equality(other.base._fun.first.first[i]->bound_to, care_about_ref)) ) + if ( !(base._fun.first.first[i]->bound_to->equality(other.base._fun.first.first[i]->bound_to, care_about_ref, count_unknown_as_equal)) ) return false return true }