Неявная инициализация ссылочных переменных
От: Алексей П Россия  
Дата: 04.07.07 10:38
Оценка:
Предлагаю приделать к компилятору выдачу ворнинга при неявной инициализации изменяемых переменных ссылочных типов — там оказывается null, что вредно например при работе со списками и опциями, получается поведение от фазы луны — может вдруг вылезти MatchFailureException или NullReferenceException, а может и нормально работать будет. Лучше когда null там оказывается осознанно.

Вот только сам я это пожалуй не осилю сделать, вернее надо долго разбираться.
Re: Неявная инициализация ссылочных переменных
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 04.07.07 15:03
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Предлагаю приделать к компилятору выдачу ворнинга при неявной инициализации изменяемых переменных ссылочных типов — там оказывается null, что вредно например при работе со списками и опциями, получается поведение от фазы луны — может вдруг вылезти MatchFailureException или NullReferenceException, а может и нормально работать будет. Лучше когда null там оказывается осознанно.


АП>Вот только сам я это пожалуй не осилю сделать, вернее надо долго разбираться.


А что, по твоему, там должно было оказаться? И вообще, инициализация переменных по месту объявления считается хорошим тоном.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Re[2]: Неявная инициализация ссылочных переменных
От: Алексей П Россия  
Дата: 04.07.07 15:19
Оценка:
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>А что, по твоему, там должно было оказаться? И вообще, инициализация переменных по месту объявления считается хорошим тоном.


Да всё правильно, по умолчанию null. Просто иногда забываю написать = [], и хотелось бы, чтобы компилятор предупреждал, что переменная объявлена и не инициализирована.
Re[3]: Неявная инициализация ссылочных переменных
От: Иванков Дмитрий Россия  
Дата: 04.07.07 19:52
Оценка: 8 (1)
Здравствуйте, Алексей П, Вы писали:

АП>Здравствуйте, Сергей Туленцев, Вы писали:


СТ>>А что, по твоему, там должно было оказаться? И вообще, инициализация переменных по месту объявления считается хорошим тоном.


АП>Да всё правильно, по умолчанию null. Просто иногда забываю написать = [], и хотелось бы, чтобы компилятор предупреждал, что переменная объявлена и не инициализирована.


Можно и грязно подключать простой макрос (вроде бы работает как надо)

using Nemerle.Compiler;

macro @mutable (expr)
syntax ("mutable", expr)
{
  match (expr) {
    | <[ $a = $b ]> => 
      Parsetree.PExpr.DefMutable (expr.loc, a, b);
    | _ =>
      Message.Warning (expr.loc, "default initialized mutable value");
      Parsetree.PExpr.DefMutable (expr.loc, expr, null);
  }
}


А в компилере еще проще править, в ncc/typing/Typer.n где-то 1200 строчка
        | PT.PExpr.DefMutable (x, null) => 
          DoType (PT.PExpr.DefMutable (x, <[ $(TExpr.DefaultValue (FreshTyVar ()) : typed) ]>), expected, is_toplevel_in_seq)

Собственно тот же ворнинг кинуть, но это если без разбора типа.
Если есть желание довести это до коммита, то еще надо бы номер придумать предупреждению, отключить по умолчанию, подумать над типами и текстом, выложить патч на всеобщее обсуждение
Re[4]: Неявная инициализация ссылочных переменных
От: Алексей П Россия  
Дата: 05.07.07 07:36
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ИД>Можно и грязно подключать простой макрос (вроде бы работает как надо)


ИД>А в компилере еще проще править, в ncc/typing/Typer.n где-то 1200 строчка

ИД>
ИД>        | PT.PExpr.DefMutable (x, null) => 
ИД>          DoType (PT.PExpr.DefMutable (x, <[ $(TExpr.DefaultValue (FreshTyVar ()) : typed) ]>), expected, is_toplevel_in_seq)
ИД>

ИД>Собственно тот же ворнинг кинуть, но это если без разбора типа.

Но это всё не распространяется на переменные-поля, а хотелось бы. Даже больше, чем для локальных, потому что локальных изменяемых переменных у меня почти и нет
Re: Неявная инициализация ссылочных переменных
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.07 10:36
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Предлагаю приделать к компилятору выдачу ворнинга при неявной инициализации изменяемых переменных ссылочных типов — там оказывается null, что вредно например при работе со списками и опциями, получается поведение от фазы луны — может вдруг вылезти MatchFailureException или NullReferenceException, а может и нормально работать будет. Лучше когда null там оказывается осознанно.


АП>Вот только сам я это пожалуй не осилю сделать, вернее надо долго разбираться.


Это уже обсуждалось. Для подобной фунциональности нужно писать полноценный анализ потока данных, чтобы вычислить, что переменная инициализирована. А это не простая задача.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Неявная инициализация ссылочных переменных
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.07 16:04
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Да всё правильно, по умолчанию null. Просто иногда забываю написать = [], и хотелось бы, чтобы компилятор предупреждал, что переменная объявлена и не инициализирована.


Предлагаю сделать по дургому. Ввести атрибут, что-то вроде элемент варианта по умолчанию, и если он есть, то инициализировать переменные по умолчанию именно этим значением. Тогда поведение по умолчанию будет таким как интуитивно предпологает программист. Для списка элементом принятым по умолчанию будет Nil.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Неявная инициализация ссылочных переменных
От: Алексей П Россия  
Дата: 05.07.07 17:43
Оценка:
Здравствуйте, VladD2, Вы писали:

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


АП>>Да всё правильно, по умолчанию null. Просто иногда забываю написать = [], и хотелось бы, чтобы компилятор предупреждал, что переменная объявлена и не инициализирована.


VD>Предлагаю сделать по дургому. Ввести атрибут, что-то вроде элемент варианта по умолчанию, и если он есть, то инициализировать переменные по умолчанию именно этим значением. Тогда поведение по умолчанию будет таким как интуитивно предпологает программист. Для списка элементом принятым по умолчанию будет Nil.


Неплохо, но может привести к обратным ошибкам в существующем коде (если это будут не только списки — для них всё должно быть ок).
И как определять, надо ли ставить это нестандартное значение — просто тупо если не указано при объявлении переменной?
Re[5]: Неявная инициализация ссылочных переменных
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.07 22:18
Оценка: +1
Здравствуйте, Алексей П, Вы писали:

АП>Неплохо, но может привести к обратным ошибкам в существующем коде (если это будут не только списки — для них всё должно быть ок).


Не хорошо конечно, но ведь пока не релиз не смертельно. А потом проще жить будет.

АП>И как определять, надо ли ставить это нестандартное значение — просто тупо если не указано при объявлении переменной?


Ага.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Неявная инициализация ссылочных переменных
От: Алексей П Россия  
Дата: 06.07.07 07:23
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не хорошо конечно, но ведь пока не релиз не смертельно. А потом проще жить будет.


Рассуждая так, надо бы еще убрать из Nemerle.Collections интерфейсы IEnumerable и IEnumerator (lib/oldapi.n) — мешают при открытии одновременно N.C и System.Collections.Generic.
Re[7]: Неявная инициализация ссылочных переменных
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.07.07 18:35
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Рассуждая так, надо бы еще убрать из Nemerle.Collections интерфейсы IEnumerable и IEnumerator (lib/oldapi.n) — мешают при открытии одновременно N.C и System.Collections.Generic.


Надо. И они уже помечены как запрещенные. Так что к релизу уберутся.

Но с System.Collections.GenericSystem.Collections.Generic все равно конфликт будет, так как утилитарный класс для списка имеет имя List, а это конфликтует с List[T] из System.Collections.Generic.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.