
Evgeny
25.12.2017
12:56:35
костыльный assumeSafeAppend

Oleg
25.12.2017
13:00:26
Ну так это просто знание языка

Evgeny
25.12.2017
13:04:59
да, но это лишний WAT
вот я тут сделал пример: https://run.dlang.io/is/t88k7F

Google

Evgeny
25.12.2017
13:05:44
почему эти две функции работают по разному?
первая не реаллоцирует, а вторая реаллоцирует?
и где-нибудь есть в доках описание, как именно себя ведет capacity у слайсов?

Oleg
25.12.2017
13:08:28
нужно объединить такие вещи в отдельный раздел на dusful
чтобы явно показывать "правильный путь"
когда нет ub

Evgeny
25.12.2017
13:09:21
если правая граница слайса меньше, чем длина исходного массива, то капасити автоматически становится нулевым (отсюда и реаллокация), а если совпадает с длиной исходного массива, то капасити равно капасити исходного массива минус левая граница слайса
ub нет, все вполне определено, только слишком запутанно и сложно

Oleg
25.12.2017
13:10:21
тоесть это где-то определено?..
или это из ответа на форуме от разработчиков?

Evgeny
25.12.2017
13:10:47
Это определено мною экспериментально, давно
ну и оно вполне логично

Google

Oleg
25.12.2017
13:11:16
так это может быть ub

Evgeny
25.12.2017
13:11:34
нет, я могу заранее сказать будет реаллокация или нет, достаточно точно

Oleg
25.12.2017
13:11:35
просто конкретная реализация в данном случае вот такая
потому что используется один и тот же фронтенд
ub это же не обязательно рандом

Evgeny
25.12.2017
13:12:11
ub - это рандом
тут скорее не описано точно

Oleg
25.12.2017
13:12:31
это то поведение, на которое не следует полагаться, которое не документированно и может меняться от версии к версии

Evgeny
25.12.2017
13:12:47
ага, но тут скорее UB в доках

Oleg
25.12.2017
13:13:15
так это и попадает под термин undefined
не определённое поведение
не определено оно в документации
значит как оно себя конкретно ведёт не является ни правильным, ни неправильным

Evgeny
25.12.2017
13:13:58
это скорее терминологический спор

Oleg
25.12.2017
13:14:07
например инициализация переменных в Си

Evgeny
25.12.2017
13:14:09
предлагаю забить, ибо неинтересно
кстати в новой редакции стандарта C++ кое что изменили

Oleg
25.12.2017
13:14:47
сделали как в D?)

Evgeny
25.12.2017
13:15:04
теперь отстутствие инициализации там называют тоже инициализацией

Google

Evgeny
25.12.2017
13:15:13
:D
И вроде как формально нет никакого UB :)

Oleg
25.12.2017
13:15:56
и что в итоге там лежит например для float и int?
nan и 0?

Evgeny
25.12.2017
13:16:08
все как раньше
неведомо что

Oleg
25.12.2017
13:16:15
а
и это именно должен реализовывать компилятор?

Evgeny
25.12.2017
13:16:40
просто раньше это называлось отсутствие инициализации, а теперь инициализация отсутствием инициализации, как-то так :D
в компиляторе ничего не поменялось в этом плане, изменился текст
теперь каг-бэ все переменные в плюсах инициализируются. Просто некоторые конкретными значениями, а некоторые рандомом из стека, хе-хе-хе.
кстати статика и глобальность в плюсах инициализируется по умолчанию нулями

Oleg
25.12.2017
13:19:19
можешь по D примеры вот такие выписать (как с массивом)? я потом оформлю в dusful (если конечно тебе не сложно, то было бы здово если бы ты сам их туда скинул)
это действительно может вызвать боль у людей, которые знакомятся с D

Evgeny
25.12.2017
13:20:01
мне очень лениво, не умею и не люблю писать документацию
вообще, неестественностей в D и фобосе полным-полно

Oleg
25.12.2017
13:21:02
просто для меня уже такой проблемы нет, я настолько ко всем таким приколам привык, что даже не замечаю как обхожу их

Evgeny
25.12.2017
13:22:45
вот еще один прикол:
https://run.dlang.io/is/y0vFGd
как определить тип элемента массива? ни в коем случае не ElementType, а typeof(T.init[0]) изврат сука

Oleg
25.12.2017
13:24:14
не не не, стоп, тут всё удобно

Google

Evgeny
25.12.2017
13:24:30
оно удобно, но не очевидно
любому новичку это покажется крайне странным

Oleg
25.12.2017
13:24:51
возможно

Evgeny
25.12.2017
13:25:01
это хреново
чем меньше неочевидностей, тем лучше
автодекодирование вообще спорная штука, авторы сами сомневаются, что это верный подход

Oleg
25.12.2017
13:26:19
и того, на данный момент можно написать про
1. SFINAE
2. массивы и перевыделение памяти
3. аттрибуты
4. автодекодирование строк

Evgeny
25.12.2017
13:26:41
сфинае редкий зверь
я с этой жопой столкнулся когда сериализовал в json в vibe.d

Admin
ERROR: S client not available

Evgeny
25.12.2017
13:27:51
там все хорошо, но если кастомная полиси сериализации было с ошибкой, то сериализатор молча делал fallback к умолчальной полиси.
именно из-за SFINAE
в итоге оно просто неправильно сериализовалось и попробуй найди в чем косяк
такая же херня с opDispatch
через раз работающий inout
тут можно долго перечислять наверное

Oleg
25.12.2017
13:30:53
всмысле я не понял
я его только в простых ситуациях пользовал

Evgeny
25.12.2017
13:31:32
ну я пример с ходу немогу привести, просто оно перестает компиляться хотя должно. я вообще перестал им пользоваться из-за этого

Google

Evgeny
25.12.2017
13:32:18
имеется в виду
`
class Foo {
int foo() inout {...}
}
многие не понимают еще разницу между immutable и const
ну и знаменитая жопа с невозможностью создать мутабельную ссылку на иммутабельный класс, из-за которого был накостылен уродский Rebindable

Dmitry
25.12.2017
13:49:10
В других языках с иммутабельностью это тоже делается не так просто, используются специальные рефы, мвары да атомы..

Evgeny
25.12.2017
13:57:42
почему? в плюсах легко
мутабельная ссылка на константный класс делается на раз

Oleg
25.12.2017
14:08:04
по всей видимости кто-то когда-то решил, что это может редко пригодиться и это "вошло в моду"
всмысле выделять это в особый случай и реализовывать не через стандартные средства языка

Evgeny
25.12.2017
14:11:02
вообще-то это полезная штука для concurrency
на самом деле - ошибка дизайна как по мне

Dmitry
25.12.2017
14:27:59
Я про языки с настоящей иммутабельностью - окамл, хаскель, кложа.. Не С++.

Evgeny
25.12.2017
14:29:15
эти языки нет смысла обсуждать, потому что в них нет мутабельных ссылок
я говорю про мутабельные ссылки на иммутабельный класс
в дешке можно сделать мутабельную ссылку на иммутабельный массив, а вот на класс нет
и чем дешная иммутабельность не настоящая?
окамл, хаскель и кложа - это вообще ФП, они тут совсем не в тему

Dmitry
25.12.2017
14:33:40
Там есть мутабельные ссылки.
А ненастоящая иммутабельность в С++.

Evgeny
25.12.2017
14:41:31
в хаскеле вроде нет

Dmitry
25.12.2017
14:42:20
https://hackage.haskell.org/package/base-4.10.1.0/docs/Control-Concurrent-MVar.html

Evgeny
25.12.2017
14:42:24
почему в плюсах ненастоящая иммутабельность? Если объект изначально создан const, то он вполне себе настоящий иммутабельный
этож костыль