Наткнулся на странную проблему связанную с списками. Она выявляется в виде match_failure_exception в неожиданном месте. Долго пытался понять почему вызов метода Iter на списке дает это исключение и понял что все дело в том, что если список создается с помощью складывания например так:
class Test
{
data : list[int];
Add(d : int) : void
{
data ::= d;
}
Add(lst : list[int]) : void
{
data=data+lst;
}
}
то если список в классе был null, то NRE не будет выдано, список нормально создастся, но после когда перебирать его элементы, например так:
data.Iter(SomeFunc);
в конце будет выдано исключение match_failure потому что ему не нравится два варианта match в Iter:
public Iter[T] (l : list [T], f : T -> void) : void
{
match (l)
{
| x :: xs => f (x); Iter (xs, f)
| [] => ()
}
}
на месте где список по идее должен быть пустым, он дает match_failure, это лечится или если переписать Iter с случаем
|_ => () или не делать складывания списка c null, тоже происходит и во всех остальных функциях работы со списками
По моему мнению это баг, если список null он просто должен интерпретироваться как пустой и создаваться на основе другого аргумента при складывании. Кто нибудь может помочь в поиске проблемы в компиляторе, известна ли доныне эта проблема?