Странности 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 он просто должен интерпретироваться как пустой и создаваться на основе другого аргумента при складывании. Кто нибудь может помочь в поиске проблемы в компиляторе, известна ли доныне эта проблема?
Re: Странности null списков
От: hardcase Пират http://nemerle.org
Дата: 20.07.11 09:44
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>то если список в классе был null, то NRE не будет выдано, список нормально создастся, но после когда перебирать его элементы, например так:


Полагаю что это в операторе сложения, раз он пропускает null.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Странности null списков
От: CodingUnit Россия  
Дата: 20.07.11 09:56
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, CodingUnit, Вы писали:


CU>>то если список в классе был null, то NRE не будет выдано, список нормально создастся, но после когда перебирать его элементы, например так:


H>Полагаю что это в операторе сложения, раз он пропускает null.


В операторе сложения используется Append и RevAppend, но они почему то пропускают null, там везде используется синтаксис создания списка a :: tail, он наверное где то внутри компилятора находится, наверное там надо искать ошибку, я еще пока не знаю где это можно найти, может кто нибудь поправить, список все таки такая часто используемая вещь.
Re[3]: Странности null списков
От: WolfHound  
Дата: 20.07.11 10:55
Оценка: +2
Здравствуйте, CodingUnit, Вы писали:

CU>В операторе сложения используется Append и RevAppend, но они почему то пропускают null, там везде используется синтаксис создания списка a :: tail, он наверное где то внутри компилятора находится, наверное там надо искать ошибку, я еще пока не знаю где это можно найти, может кто нибудь поправить, список все таки такая часто используемая вещь.

Тут есть два способа это поправить:
1)Кидать исключение.
2)Считать что null == [].
Думаю правильно кидать исключение.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Странности null списков
От: CodingUnit Россия  
Дата: 20.07.11 11:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, CodingUnit, Вы писали:


CU>>В операторе сложения используется Append и RevAppend, но они почему то пропускают null, там везде используется синтаксис создания списка a :: tail, он наверное где то внутри компилятора находится, наверное там надо искать ошибку, я еще пока не знаю где это можно найти, может кто нибудь поправить, список все таки такая часто используемая вещь.

WH>Тут есть два способа это поправить:
WH>1)Кидать исключение.
WH>2)Считать что null == [].
WH>Думаю правильно кидать исключение.

Если кидать каждый раз исключение, то придется постоянно проверять если список null, то присваивать [], если до сих пор вариант со сложением с null списком проходит, значит так задумали сами разработчики, только при этом вести себя он должен правильно, я бы был рад если бы он просто складывался и не давал потом глюков, тогда создавать их было бы проще.





от макросов до вариантов
и массой всяких преимуществ
благодаря nemerle-братству
программеров жизнь стала лучше
Re[5]: Странности null списков
От: hardcase Пират http://nemerle.org
Дата: 20.07.11 12:01
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Если кидать каждый раз исключение, то придется постоянно проверять если список null, то присваивать [], если до сих пор вариант со сложением с null


У меня в планах посмотреть что там наваял Klapaucius для новой стандартной библиотеки (но это после того как я разделаюсь с типизацией атрибутов).
Сейчас же нужно в проблемных методах добавить [NotNull] контракт на аргументы.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Странности null списков
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.07.11 16:34
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Если кидать каждый раз исключение, то придется постоянно проверять если список null, то присваивать [], если до сих пор вариант со сложением с null списком проходит, значит так задумали сами разработчики, только при этом вести себя он должен правильно, я бы был рад если бы он просто складывался и не давал потом глюков, тогда создавать их было бы проще.


Все что нужно в твоем примере — это проинициализировать поле:
class Test
{
  data : list[int] = [];

  Add(d : int) : void
  {
    data ::= d;
  }

  Add(lst : list[int]) : void
  {
    data=data+lst;
  }
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Странности null списков
От: CodingUnit Россия  
Дата: 27.07.11 07:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, CodingUnit, Вы писали:


CU>>Если кидать каждый раз исключение, то придется постоянно проверять если список null, то присваивать [], если до сих пор вариант со сложением с null списком проходит, значит так задумали сами разработчики, только при этом вести себя он должен правильно, я бы был рад если бы он просто складывался и не давал потом глюков, тогда создавать их было бы проще.


VD>Все что нужно в твоем примере — это проинициализировать поле:

VD>
VD>class Test
VD>{
VD>  data : list[int] = [];

VD>  Add(d : int) : void
VD>  {
VD>    data ::= d;
VD>  }

VD>  Add(lst : list[int]) : void
VD>  {
VD>    data=data+lst;
VD>  }
VD>}
VD>


Хорошо, большинство считает что нужно инициализировать поле [] и кидать исключение при null, пусть будет так, но тогда надо добавить не только NotNull контракты, но и сделать проверку в операторе создания списка head :: tail, он тоже может присоединяться к null списку
Re[7]: Странности null списков
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.07.11 09:03
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Хорошо, большинство считает что нужно инициализировать поле [] и кидать исключение при null, пусть будет так, но тогда надо добавить не только NotNull контракты, но и сделать проверку в операторе создания списка head :: tail, он тоже может присоединяться к null списку


Fork/Pull request в Github уже освоил? Если — да, то делай пул-реквест с изменениями. Если — нет, то осваивай. Теперь это самое важное умение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Странности null списков
От: CodingUnit Россия  
Дата: 27.07.11 09:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, CodingUnit, Вы писали:


CU>>Хорошо, большинство считает что нужно инициализировать поле [] и кидать исключение при null, пусть будет так, но тогда надо добавить не только NotNull контракты, но и сделать проверку в операторе создания списка head :: tail, он тоже может присоединяться к null списку


VD>Fork/Pull request в Github уже освоил? Если — да, то делай пул-реквест с изменениями. Если — нет, то осваивай. Теперь это самое важное умение.


Github осваиваю, с контрактами понятно, но head :: tail синтаксис наверное где то глубоко в компиляторе, это я не знаю где делается. Хорошо бы кто нибудь из знающих пофиксил.
Re[9]: Странности null списков
От: hardcase Пират http://nemerle.org
Дата: 27.07.11 09:30
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Github осваиваю, с контрактами понятно, но head :: tail синтаксис наверное где то глубоко в компиляторе, это я не знаю где делается. Хорошо бы кто нибудь из знающих пофиксил.


Синтаксис тут ни при чем. Нужно добавить явный конструктор варианте list:
variant list[T]
{
  | Cons
  {
    public new this(value : T, [NotNull] tail : list[T])
    {
      this.value = value;
      this.tail = tail;
    }
  }
...
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[9]: Странности null списков
От: _nn_ www.nemerleweb.com
Дата: 27.07.11 09:34
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Github осваиваю, с контрактами понятно, но head :: tail синтаксис наверное где то глубоко в компиляторе, это я не знаю где делается. Хорошо бы кто нибудь из знающих пофиксил.


Это называется глубоко в компиляторе ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: Странности null списков
От: CodingUnit Россия  
Дата: 27.07.11 09:38
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, CodingUnit, Вы писали:


CU>>Github осваиваю, с контрактами понятно, но head :: tail синтаксис наверное где то глубоко в компиляторе, это я не знаю где делается. Хорошо бы кто нибудь из знающих пофиксил.


__>Это называется глубоко в компиляторе ?


Ну значит проще чем предполагалось, совместными командными усилиями
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.