[23:06:01] <vgodunko> not null чем не подходит?
[23:06:11] <vgodunko> Тот же вынос мозга.
[23:11:09] <valexey> переменная типа not null чем будет инициализирована изначально?
[23:11:30] <valexey> судя по папиру, там предлагают инициализировать её чем-то
[23:11:39] <valexey> каким-то дефолтным объектом
[23:14:01] <valexey> по кр. мере так сказано вот в этом труде: http://www.ada-ru.org/safe_secure_2012
[23:15:45] <valexey> "Мы можем явно задать, что ссылочное значение всегда будет отличным от null, записав определение переменной следующим образом:
WD : not null access Date := Wedding_Day'Access;
Естественно, сразу нужно указать начальное значение отличное от null."
[23:15:57] <valexey> вот в этом отличие. такое лекарство - хуже болезни
[23:16:08] <valexey> ибо плодит ровно те же ошибки, только теперь нулл стал другим
[23:16:28] <valexey> и по умолчанию при обращении к такой некорректной (дефолтной) ссылке рантайм даже и не мявкнет
[23:16:38] <valexey> а вот в Котлине такие обращения в принципе не возможны
[23:17:30] <valexey> "В том случае, если Вы считаете использование произвольной функции (в
данном случае Sqrt), как начального значения не равного null безвкусицей,
можно определить специальную функцию для значения по умолчанию"
[23:17:32] <valexey> короче, фигня
[23:17:51] <valexey> в котлине сделано нормально, в Аде - кривущий костыль, который вообще не лечит.
[23:20:57] <vgodunko> Так а чем там инициализируется по умолчанию?
[23:23:08] <valexey> ничем, но разименовать ты не сможешь, будет ошибка компиляции пока не проверишь на нуль
[23:23:22] <valexey> прочитай по ссылке таки, там описано лучше чем я объясняю
[23:23:47] <valexey> грубо говоря, после того как ты проверишь (с помощью банального ифа) у переменной меняется тип (в соответствующем скопе)
[23:29:59] <vgodunko> Да вот читаю... И не понимаю... Ну да, ну круто, но...
[23:29:59] <vgodunko> not null отчасти в Ada даёт тот же эффект.
[23:30:03] <valexey> то что там будет не нуль, а какой-то мусор левый (как в статье про безопасность Ады) - ничего хорошего не даст
[23:30:17] <valexey> ну да, не будет исключения при обращении по такой ссылке. Но это же еще хуже!
[23:30:33] <vgodunko> Согласен.
[23:30:45] <vgodunko> Тогда не нужно инициализировать пургой
[23:31:02] <valexey> А чем?
[23:31:13] <vgodunko> Нужным значением!
[23:31:31] <vgodunko> Если not null - всегда имеет значение
[23:31:41] <valexey> иногда оно не доступно. это уже разбирали с кем-то. т.е. объявляем переменную сейчас, инициализируем потом
[23:31:54] <vgodunko> Попытка прилепить лишь бы не null - те же яйца, вид сбоку
[23:32:14] <valexey> типа:
type* a;
if (something) a = foo()
else a = bar()
[23:32:41] <valexey> вот чем тут a изначально инициализировать?
[23:32:51] <vgodunko> X : not null access Integer := (if Something then A'Access else B'Access);
[23:33:22] <vgodunko> В том числе и для этого и ввели подобные выражения.
[23:33:37] <valexey> там есть третий вариант - foo и bar могут таки вернуть что-то нулевое например :-) т.е. в а что-то может лежать после этого, а может и не лежать. это бывает полезно.
[23:33:49] <valexey> поэтому в котлине ты к А не сможешь обратиться пока не проверишь его
[23:34:08] <valexey> но как только
if (a!=null) {
// тут уже к a можно обращаться
}
[23:34:15] <valexey> что, по моему, весьма естественно
[23:34:19] <valexey> для императивщины
[23:34:27] <valexey> у функциональщиков монада maybe
[23:34:52] <vgodunko> Ну может и логично
[23:35:27] <valexey> у ады тоже решение конечно, но оно не такое универсальное и не такое безопасное как тут
[23:35:46] <valexey> ибо провоцирует лепить затычки
[23:35:52] <vgodunko> Я бы сказал, что тут есть небезопасные safe calls
[23:36:06] <vgodunko> Совсем небезопасные.
[23:36:33] <valexey> а что у них такого плохого? по моему, это обычные монады аля maybe
[23:36:41] <valexey> по сути - разновидность исключений
[23:36:43] <vgodunko> Ибо вынесешь себе мозг, пока сообразишь, что в некоторый момент значение таки стало null
[23:37:09] <vgodunko> А если ещё что-то по пути имеет side effect - gbib ghjgfkj
[23:37:13] <valexey> эдакие транзакционные выражения - либо все выполнится, либо ничего.
[23:37:19] <vgodunko> совсем плохо
[23:37:35] <valexey> да, сайдэффекты это бич императивщины.
[23:38:03] <valexey> после функциональщины ОЧЕНЬ стремно программировать на таком
[23:38:15] <valexey> хочетя хотя бы спарком обмазаться :-)
[23:38:55] <vgodunko> Не поможет
[23:39:07] <vgodunko> Жизнь она сложнее и одного и другого
[23:39:15] <vgodunko> Или хитрее
[23:39:56] <valexey> ну, в хаскеле удается львиную долю чисто написать
[23:39:59] <valexey> иммутабельно
[23:40:54] <valexey> правда спарк еще суровей - там вроде и память выделять нельзя.
[23:41:45] <vgodunko> Да
[23:41:49] <valexey> даже односвязный список не реализовать
[23:41:53] <valexey> а в хаскеле - можно
[23:43:02] <valexey> но это один фиг не дает полной гарантии корректности
[23:43:27] <valexey> ну, тащемто даже полностью доказанная корректность программы/алгоритма, таковой гаранти не дает, ибо бага будет тогда тупо в ТЗ
[23:43:38] <valexey> ибо ТЗ формулируют менеджеры ;-D
[23:47:54] <vgodunko> Ничто не даёт полной гарантии.
[23:49:01] <vgodunko> В эпоху взрыва "CAD" систем было доказано только одно:
[23:49:53] <vgodunko> "По неправильно составленной модели любая CAD система сгенерирует абсолютно верную программу, дающую неправильный результат.
[23:50:28] <vgodunko> Ничто не изменилось в этом мире за уже почти 50 лет
[23:50:53] <vgodunko> А нет, обманул, 40 ktn
[23:52:21] <valexey> ну ничего, сейчас все обмажутся машинным обучением и станет совсем весело :-)
[23:52:41] <valexey> ибо машинное обучение отладить невозможно :-) ну и работает оно вероятностно
[23:53:38] <vgodunko> Да, это откроет новое направление.