@dlangru

Страница 487 из 719
Igor
01.04.2018
17:40:22
Dark
01.04.2018
17:42:12
Вы еще скажите, что у D вышел стабильный компилятор, а code.dlang.io перестал падать

Ievgenii
01.04.2018
19:38:50
)))

Google
Vitalii
02.04.2018
05:51:03
Уважаемые dlang-программеры! Прошу совета. У меня в коде есть некоторое кол-во глобальных переменных типа dictionary, хочу их вынести в отдельный модуль. Проблема в том, что часть этих глобальных переменных из них получается из других переменных с помощью некоторых операций (циклов), вроде перемены пары {ключ:значение} -> {значение:ключ}. Как это вынести в отдельный модуль, если голый цикл в модуле (вне тела функции или структуры) не компилируется? Можно попробовать загнать в структуру, но this() с пустыми скобками нельзя перегрузить, а с параметрами как-то неестественно — нет там никаких параметров, просто некоторые данные, которые нужно смотреть и в фас, и в профиль. Как это делается in D way? Возможно какой-то вариант static foreach? Буду благодарен за совет или ссылку на пример.

Maxim
02.04.2018
05:59:16
не понял из описания, это делается единожды в момент запуска программы?

Igor
02.04.2018
06:01:36
static this() для модуля не годится?

Maxim
02.04.2018
06:02:22
если единожды, то либо static this(), либо CTFE, если данные известны на этапе компиляции

Vitalii
02.04.2018
06:17:47
static this() для модуля не годится?
Да, делается единожды. Получается как бы микро база данных, которая известна заранее и не будет меняться.

Maxim
02.04.2018
06:19:07
тогда я сделал бы это черес CTFE

Vitalii
02.04.2018
06:19:09
Я только начинаю осваивать D. Ситуация как у собаки: всё понимаю, сказать не могу. :)

Maxim
02.04.2018
06:22:23
https://p0nce.github.io/d-idioms/#Precomputed-tables-at-compile-time-through-CTFE примерно, как описано тут

Valeriy
02.04.2018
07:51:30
Уважаемые dlang-программеры! Прошу совета. У меня в коде есть некоторое кол-во глобальных переменных типа dictionary, хочу их вынести в отдельный модуль. Проблема в том, что часть этих глобальных переменных из них получается из других переменных с помощью некоторых операций (циклов), вроде перемены пары {ключ:значение} -> {значение:ключ}. Как это вынести в отдельный модуль, если голый цикл в модуле (вне тела функции или структуры) не компилируется? Можно попробовать загнать в структуру, но this() с пустыми скобками нельзя перегрузить, а с параметрами как-то неестественно — нет там никаких параметров, просто некоторые данные, которые нужно смотреть и в фас, и в профиль. Как это делается in D way? Возможно какой-то вариант static foreach? Буду благодарен за совет или ссылку на пример.
Вообще в коде не должно быть глобальных переменных. Это не зависит от языка. Их наличие ясно сигнализирует об архитектурных ошибках. Соответственно, начать лучше с того, что бы продумать как от них избавиться

Pavel
02.04.2018
08:04:13
Слишком категорично сказано.

В большинстве случаев скорее так и есть, но не во всех.

Valeriy
02.04.2018
08:08:48
В большинстве случаев скорее так и есть, но не во всех.
Ну конечно. Но чаще всего именно так. Должны быть веские причины что бы их оставить. Синглтон, кстати тоже плохой альтернативой может быть.

Google
Valeriy
02.04.2018
08:09:15
Уважаемые dlang-программеры! Прошу совета. У меня в коде есть некоторое кол-во глобальных переменных типа dictionary, хочу их вынести в отдельный модуль. Проблема в том, что часть этих глобальных переменных из них получается из других переменных с помощью некоторых операций (циклов), вроде перемены пары {ключ:значение} -> {значение:ключ}. Как это вынести в отдельный модуль, если голый цикл в модуле (вне тела функции или структуры) не компилируется? Можно попробовать загнать в структуру, но this() с пустыми скобками нельзя перегрузить, а с параметрами как-то неестественно — нет там никаких параметров, просто некоторые данные, которые нужно смотреть и в фас, и в профиль. Как это делается in D way? Возможно какой-то вариант static foreach? Буду благодарен за совет или ссылку на пример.
Напиши кейсы использования глобальных переменных. Попробую предложить варианты обхода без них

Dmitry
02.04.2018
08:13:35
Я глобалами обычно только разные константы делаю.

Valeriy
02.04.2018
08:15:15
Константы тоже лучше оборачивать в какую нибудь структуру options и через конструктор передавать.

Maxim
02.04.2018
08:32:02
я так понял, речь идет о каких-то константных данных, которые вытекают из каких-то других константных данных)

конечно, есть подозрение, что там надо всю архитектуру менять, но человек же только осваивает)

Evgeny
02.04.2018
08:33:09
Впрочем я понял, речь об определенных константах

Опции для создания объектов и т.д.

Но бывают просто некие общие иммутабельные данные расшаренные между множеством объектов

Vitalii
02.04.2018
08:35:18
Вообще в коде не должно быть глобальных переменных. Это не зависит от языка. Их наличие ясно сигнализирует об архитектурных ошибках. Соответственно, начать лучше с того, что бы продумать как от них избавиться
Не должно быть, но бывают, к сожалению. Александреску, как-то рассказывал, как они (когда он ещё работал в Facebook-e) нашли баг в gcc: тот валился, если число глобальных переменных в коде было больше 2^15.

Evgeny
02.04.2018
08:36:51
Просто желательно не злоупотреблять глобальными переменными, особенно shared / __gshared

Valeriy
02.04.2018
08:46:50
Ну смысл такой, что если глобальные переменные это не физические или математические константы, то они являются потенциальным источником багов. Так то какая нибудьт Пи или постаянная планка вполне себе может быть глобальным енумом.

Ackeard
02.04.2018
09:02:47
история с прошлой работы на цпп. почти каждый класс в хэдере имел екстерн инстанса. из за этой херни почти все модули зависели друг от друга, и компиляция занимала по 15 минут. это так здорово создавая новый проект на основе тех исходников с уверенностью инклюдить ВСЕ. кстати это был военный проект) наши налоги в надежных руках, какбе

Vitalii
02.04.2018
09:15:39
Вот этот словарь хочу сделать глобальным неизменным CTFE: static immutable uint[7][char] ssrIdGnss = [ 'G' : [1057,1058,1059,1060,1061,1062,2065], 'R' : [1063,1064,1065,1066,1067,1068, 0], 'E' : [1240,1241,1242,1243,1244,1245,2067], 'J' : [1246,1247,1248,1249,1250,1251,2068], 'C' : [1258,1259,1260,1261,1262,1263,2070] ]; Но dmd выдаёт: D:\SRC\D_lang\SSR>dmd -m64 ssr.d ssr.d(218): Error: non-constant expression ['G':[1057u, 1058u, 1059u, 1060u, 1061u, 1062u, 2065u], 'R':[1063u, 1064u, 1065u, 1066u, 1067u, 1068u, 67u], 'J':[1246u, 1247u, 1248u, 1249u, 1250u, 1251u, 2068u], 'C':[1258u, 1259u, 1260u, 1261u, 1262u, 1263u, 2070u]]

Значения в словаре зафиксированы, меняться не будут.

Далее в коде идёт некоторая манипуляция с ними и на основе этого словаря (ssrIdGnss) создаётся ещё несколько, такого же типа, константные, заданные раз и на всегда.

Igor
02.04.2018
09:52:33
Ну сообщение достаточно однозначное - в immutable данные вставляешь мутабельные массивы

Maxim
02.04.2018
10:46:01
а не будет тогда этот массив копироваться во все места, где используется?

Pavel
02.04.2018
10:50:32
Если массив совсем статический, то зачем его делать массивом? По нему итерироваться надо?

Google
Pavel
02.04.2018
10:50:45
Сделай 5 статических подмассивов.

uint[7] ssrIdGnssG = [1057,1058,1059,1060,1061,1062,2065];

Vitalii
02.04.2018
10:55:06
Спасибо, попробую предложенные варианты.

Maxim
02.04.2018
11:08:03
да, кстати, ассоциативные массивы, получается только через static this() инициализировать можно?

https://forum.dlang.org/thread/suvgfdsgyuynpmdmdjfz@forum.dlang.org?page=1 сам спросил, сам ответил: да)

Evgeny
02.04.2018
13:15:28
да, кстати, ассоциативные массивы, получается только через static this() инициализировать можно?
Увы, да. ИМХО, косяк компилятора. Должен разрешать подобное делать

Увы, да. ИМХО, косяк компилятора. Должен разрешать подобное делать
Хотя, может я и не прав. Все-таки ассоциативный массив слишком сложная структура, чтобы быть куском константно инициализированной памяти.

Pavel
02.04.2018
13:22:41
Ну да там же используется хешмап для того чтобы хранить ключи, небось что-то аллоцируется. Просто так не построишь

Это надо статический субрантайм придумывать :) И мета-мета-программирование

Pavel
02.04.2018
13:34:35
Спорно. По крайней мере для LDC

Vitalii
02.04.2018
13:34:43
Оно вроде работает, только из другого (использующего) модуля не видно: ssr.d(402): Error: undefined identifier ssrIdGnss;

Имя модуля и имя файла должны совпадать?

Получаю какие-то ругательства линкера:

ssr.obj : warning LNK4217: локально определенный символ _D4gnss9headLenIdxHkAk импортирован в функцию _Dmain gnss.obj : warning LNK4049: импортирован локально определенный символ

Оказывается public надо ставить

Evgeny
02.04.2018
14:19:52
Оказывается public надо ставить
зачем? И да, имя модуля и файла должно совпадать

Google
Evgeny
02.04.2018
14:21:11
А зачем тогда module?
потому что я немножко наврал, последняя часть названия модуля должна совпадать с именем файла

Pavel
02.04.2018
14:21:39
Хм да? А вроде бы нет

Evgeny
02.04.2018
14:22:23
скажем module super.puper.hello; означает, что файл hello.d лежит в папке super/puper

super зарезервированное слово и реально такое имя не прокатит, но вы поняли, да

Dark
02.04.2018
14:25:14
И что нам это даёт?

Evgeny
02.04.2018
14:25:44
И что нам это даёт?
ничего кроме головной боли

Pavel
02.04.2018
14:25:55
Если оно так, то оно удобно и однозначно

Admin
ERROR: S client not available

Pavel
02.04.2018
14:26:10
Всегда можно легко найти код модуля в файловой системе

Evgeny
02.04.2018
14:26:28
но в целом пофиг

Pavel
02.04.2018
14:26:47
Ну да может, но в целом то удобство и ясность это хорошо

Evgeny
02.04.2018
14:27:20
можно директиву module не указывать

и вроде как разрешено делать название модуля не совпадающим с именем файла, но у меня всегда фейлится если такой модуль пытаться импортировать

может я что-то не до конца понимаю в этой системе

Dark
02.04.2018
14:31:47
Ясно это, конечно, хорошо, но вообще такая модульная система посылает нафиг файлы с именем с точкой

Google
Evgeny
02.04.2018
14:33:12
Now, you *can* possibly name the module differently using a module statement, but this is highly discouraged. If you do this, the only way another module can import your differently-named module is if you pass the file on the command line.

короче можете называть модули иначе, чем файлы их содержащие, но потом заебётесь их импортировать

Dark
02.04.2018
14:35:50
Странное правило

Evgeny
02.04.2018
14:37:33
Странное правило
Ну зато оно заставляет держать исходники в порядке. После плюсов непривычно, но в целом особо не парит.

Dark
02.04.2018
14:38:03
но в целом особо не мешает
Не мешает, но все равно я считаю, что require чем-то лучше такого

Evgeny
02.04.2018
14:39:06
откуда именно require?

Dark
02.04.2018
14:39:24
Из JS, я имел ввиду

Evgeny
02.04.2018
14:39:52
Эм разве JS поддерживает модули?

require там вроде просто функция подгружающая модуль, причем в рантайме

Dark
02.04.2018
14:43:41
Эм разве JS поддерживает модули?
Как часть стандарта - нет, в стандарте есть import, но который толком незаимплементирован.

require там вроде просто функция подгружающая модуль, причем в рантайме
Верно. Но у меня стойкое убеждение, что require смотрится куда более продуманым и органичным в JS, чем эти модули в D

В D, кстати, можно вызвать функцию без импорта?

Pavel
02.04.2018
15:21:34
Ну можно весь модуль импортировать и тогда да

Dark
02.04.2018
15:27:11
Тогда это уже с импортом будет

Stanislav
02.04.2018
15:28:15
можно типа import module.module : function;

если не охота все импортировать

только смысл не понятен)

чего экономить. чтобы ide не тормозила?

Dark
02.04.2018
15:33:51
Ну когда импортов на 2 страницы текста, в каждом из которых нам нужна одна функция...

Pavel
02.04.2018
15:35:56
Можно делать сборки из этих импортов и объединять их в public import

Например создаешь модуль importall.d и там импортируешь 200 токенов через public import. А во всем остальном коде делаешь import importall

Страница 487 из 719