Странности null списков
От: CodingUnit Россия  
Дата: 20.07.11 09:35
Оценка:
Наткнулся на странную проблему связанную с списками. Она выявляется в виде 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 он просто должен интерпретироваться как пустой и создаваться на основе другого аргумента при складывании. Кто нибудь может помочь в поиске проблемы в компиляторе, известна ли доныне эта проблема?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.