
Stepanos
27.12.2017
12:57:44
или то другой раздел будет?

Evgeny
27.12.2017
12:59:34
насколько я понял, это не описание работы массивов, а типа подводный камень

Oleg
27.12.2017
12:59:45
Именно неявное подведение, которое может ввести в заблуждение

Google

Evgeny
27.12.2017
13:00:11
а с помощью assumeSafeAppend, можно наоборот форсировать рантайм использовать зарезервированную память по возможности

Oleg
27.12.2017
13:03:22
сейчас добавлю

Evgeny
27.12.2017
13:04:00
и не только зарезервированную кстати
в смысле она может быть уже использования в других слайсах, и может быть затерта таким способом
но удобна для повторного использования массива. Потому что если просто сделать arr.length = 0, то при простом добавлении элемента будет реаллокация, а с assumeSafeAppend не будет.

Mike
27.12.2017
18:40:01
Кстати, раз уж речь зашла... так и не понял - зачем эта замута с мутабл/иммутабл..??

Dmitry
27.12.2017
18:48:20
Практика языков, где все иммутабельно или хотя бы по умолчанию иммутабельно, показала, что так багов меньше. Можно спокойно передавать туда-сюда данные по ссылке (быстро!) и не беспокоиться о том, что какая-то ф-я или другой поток их изменят неожиданно.

Evgeny
27.12.2017
18:50:30
для многопоточности да

Igor
27.12.2017
19:26:11
с одной стороны хочется писать быстро и просто, с другой стороны хочется писать безопасно и правильно, с третьей стороны код должен быть эффективным… вот и родятся всякие замуты что-бы дать возможность программеру делатьи то и другое и третье

Evgeny
27.12.2017
19:38:55
все разом не получится, я гарантирую это

Mike
27.12.2017
19:40:39

Oleg
27.12.2017
19:44:26

Google

Mike
27.12.2017
19:48:44

Igor
27.12.2017
19:48:49

Maxim
27.12.2017
19:49:34
он же не Владимир, а Вадим вроде)

Ievgenii
27.12.2017
20:33:58

Oleg
27.12.2017
20:34:22

Ievgenii
27.12.2017
20:35:03
+ имютебл нужен для того, чтобы эти данные не меняли. И не меняли в функции, а не только в соседнем потоке

Mike
27.12.2017
20:45:14

qwerty
27.12.2017
20:47:56
если бы их было столько

Ievgenii
27.12.2017
20:49:09

Mike
27.12.2017
20:50:10
А сколько тебе?)
достаточно сказать что "пора учёбы" уже позади) теперь пора "хуяк хуяк и в продакшин" ??

Ievgenii
27.12.2017
20:50:34
Это такая большая тайна?)

qwerty
27.12.2017
20:51:39
с inout действительно какая-то странная ситуация
у immutable есть нюанс, но он не в переменных, а в указателях. Если есть переменная, то на нее можно сделать константный указатель. Однако он не будет гарантировать того, что значение этой переменной не изменится в другом месте. Если видите immutable указатель, можете быть спокойны, что данные нигде не меняются

Igor
27.12.2017
20:55:46

qwerty
27.12.2017
20:55:53
нет

Igor
27.12.2017
20:56:41
тогда непонятно. к inout это вроде не имеет отношения

Ievgenii
27.12.2017
20:56:51
С in все понятно, можно вызывать без каста
А если там конст или имютейбл, нужно кастить, вроде

Google

qwerty
27.12.2017
20:57:44
.....а const для чего же тогда..?? ?

Igor
27.12.2017
20:58:07
inout нужен если константность того, что функция возращает зависит от константности параметра
Functions that deal with mutable, const, or immutable types with equanimity often need to transmit their type to the return value:
https://dlang.org/spec/function.html#inout-functions


Mike
27.12.2017
21:03:39
если бы их было столько
анекдот вспомнился.. тупой, но контекстно уместный))))
нагуглить не получилось, так что вкратце перескажу: в одной грузинской деревне жила была девушка, и типо книги читаьь любила. один парень к ней подкатить попытался, а она ему такая "ты, типо, тупой - вот когда прокачаешь свои эрудит-скилы, тогда и приходи" — ну он такой н растерялся и пошёл учиться, лет 30 учился, дохуя короче учёным стал. и старым. но всё ранво к ней, тоже уже старой, приходи и говорит: "я, типо самый умный стал - проверяй как хочешь" - а она ему и отвечает: "я за свою жизнь прочитала одну книгу, ги де мопасан, прочитала кучу раз - но так и не поняла, гиде же этот грузин мопасан?!?!?!"

Igor
27.12.2017
21:13:34

qwerty
27.12.2017
21:14:24
хорошо

Evgeny
27.12.2017
21:39:49

Mike
27.12.2017
21:51:08

Oleg
27.12.2017
22:17:09

Evgeny
27.12.2017
22:18:34

Evgeny
27.12.2017
22:19:00
в функциональных языках вообще все иммутабельное.

Oleg
27.12.2017
22:20:17
Вот только активное использование immutable сильнее будет жрать память
Тк каждый раз при "изменении" объекта будет выделяться новый

Mike
27.12.2017
22:42:41
Ещё вопрос: правильно ли я понял, что в Д "предполагается" что если функция не помечена как nothrow, то она может вызывать исключения.....??
т.е. ты как бы не знаешь, вызывает или нет - надо либо лезть в её нутрянку и смотреть что там (а может ещё и в нутрянку того что в ней [и так далее рекурсивно]), или же ВООБЩЕ ВСЁ оборачивать в try-catch ? где тут логика? Вот на яве наоброт - если функция генерит эксепшин (который сама не отлавливает), то она ОБЯЗАНА быть помечена как throws - таким образом всё чотенько и все всё знают (и компилятор, и программист) ?

Ievgenii
28.12.2017
00:13:46
А если исключение генерит не она, а та функция, которую она вызывает, такую функцию тоже так нужно помечать?

Pavel
28.12.2017
00:14:13
вроде да
и вроде это жесть )

Ievgenii
28.12.2017
00:20:17
Это тупость тогда

Google

Ievgenii
28.12.2017
00:20:39
А если та внутренняя функция перестала бросать исключение
Глупости
Флаг, что ты НЕ генерируешь исключительных ситуаций, выглядит куда корректней


Mike
28.12.2017
00:27:01
Флаг, что ты НЕ генерируешь исключительных ситуаций, выглядит куда корректней
а означает ли его отсутствие то что функция 100% генерит исключение..? ? мне вот что-то компилятор ни разу не высказал своё ФИ по-поводу того, что в функции, не помеченной как nothrow НЕ генерится исключение......
Отсюда вытекает что я вынужден перестраховываться и ВЕСЬкод оборачивать в отлов эксепшинов
а поскольку я ленивый, то оборачиваю на верхних уровнях, не детализируя обработку этих самый исключений, от этого страдает Ёинтеллект" программы — она просто крашится если вдруг сломалось то что не должно было (а не пытается это обойти или починить) или же не детализируется объяснение ошибок пользователю - просто "ахтунг" и всё, иди молишь (а заодно ешь и люби, желательно именно в таком порядке)
а с эксепшинами на Д красота уже не та, что могла бы быть......

Admin
ERROR: S client not available

Ievgenii
28.12.2017
00:38:14

Mike
28.12.2017
00:39:11

Ievgenii
28.12.2017
00:41:10
Ты сам сказал - ты ленив.
Если даже пометить функцию, ты не будешь ее обрабатывать
Так что нечего выдумывать
Лично меня такая концепция более чем устраивает.

Mike
28.12.2017
00:44:47

Evgeny
28.12.2017
04:40:44
был длинный срач на эту тему на оффоруме. Короче в дешке как в плюсах.


Mike
28.12.2017
04:57:25
Я вот всю ночь пытаюсь раскурить параллелелизм в Дшке...... и не получается
Пытаюсь юзать spawn() из std.concurrency
Мне нужно вызывать методы экземпляра структуры, так тчо он заставляет проставлять shared тем кто... я плохо понимаю чо это ему даёт, ну да ладно. В тестовом кусочке [https://run.dlang.io/is/d6RNez] всё норм, но в моём проекте в аналогичной ситуации выдаёт Error: cannot implicitly convert expression 'HttpServer(null, 0u, null, null, null, null, 0u, null, null).this(new InternetAddress(cast(ushort)8080u), 30u, "~/www/", "www", "api")' of type 'HttpServer' to 'shared(HttpServer)' и тыкает меня носом в том место где я экземпляр структуры объявляю...... дайте хоть одну подсказку что этой грёбаной concurreny не нравится..???
Хотел было попробовать на core.thread сделать (по аналогии с явой) - но не найду инфы как это правильно делать...
как, блин, мне запустить в новом потоке "мутабл"-функцию, передав ей параметры...???? ?


Evgeny
28.12.2017
05:17:48
std.concurrency разрешает гонять между тредами только иммутабельные или шаред данные.
шаред - это типа гарантия потокобезопасности, а на самом деле говно

Google

Evgeny
28.12.2017
05:18:41
выходов два.
cast(shared) все данные идушие в другой поток, а уже
в нем cast() для снятия этого shared.
либо забить на std.concurrency и пилить на голых потоках из core.thread

Mike
28.12.2017
05:24:07

Evgeny
28.12.2017
05:24:51
что именно? запустить поток и дать ему параметры?

Dmitry
28.12.2017
05:24:59
Вот простой пример с spawn и shared: https://dpaste.dzfl.pl/317cbf78f177

Evgeny
28.12.2017
05:26:56
выглядит норм

Dmitry
28.12.2017
05:27:13
В твоем примере с FUCK ты создаешь структуру на стеке, потом пытаешься ее методы в другом потоке дергать, когда в исходном потоке она уже могла умереть. Это пипец, компилятор тут прав, что не дает такую фигню делать.

Evgeny
28.12.2017
05:29:37
я на телефоне сейчас, поэтому полноценно не могу помочь.

Dmitry
28.12.2017
05:29:41
Я предпочитаю создавать потоки без передачи им параметров, все свои данные они создают сами (тогда никакого shared не надо), а общаются между собой уже посылкой сообщений.

Igor
28.12.2017
05:33:27
ну есть выход передавать такие данные которые передаются - например получить сокет (тип инт) и уже его передать в поток для обработки, а не мутабельную обёртку со всеми наворотами?
это если говорить о чем-то типа http сервера

Evgeny
28.12.2017
05:33:56

Dmitry
28.12.2017
05:34:36
Можно простые структуры кидать, они копируются.

Igor
28.12.2017
05:35:00
да, это самый простой выход

Dmitry
28.12.2017
05:35:27
Там довольно разумные правила для сообщений, им следовать хорошо и приятно.

Evgeny
28.12.2017
05:35:49

Dmitry
28.12.2017
05:36:02
Да. Как только пытаешься шарить мутабельные данные, сам нарываешься на баги.

Evgeny
28.12.2017
05:36:38
не всегда, надо просто уметь синхронизацию.

Dmitry
28.12.2017
05:37:36
CSP это свой подход, когда он чисто реализован, все красиво. Когда начинаешь смешивать с шаред параллелизмом и локами, красота теряется, начинаются сложности.

Evgeny
28.12.2017
05:37:38
сообщения - это оверхед, который не всегда приемлем.