
Stanislav
06.03.2018
09:05:54
https://issues.dlang.org/show_bug.cgi?id=18403
вроде оно

Vitalii
06.03.2018
09:19:26
Ага. В кои-то веки скачал человек dmd чтобы новый язык выучить, а он краш логи выдает на простейших программах
Это ещё что. Rust у меня вообще не завёлся (на Windows)

Google

Denis
06.03.2018
09:45:40
а кто-нибудь вообще смотрел код фронтенда? может там проще всё выкинуть и заново переписать (нидайбох)
очень уж дофига багов смешных таких

Денис
06.03.2018
09:51:12

Dmitry
06.03.2018
09:51:30
Пасибо
Так, а если не инты будут?

Денис
06.03.2018
09:53:25
Так, а если не инты будут?
Про сумм я писал выше - или писать универсальное что-то через reflect, или указывать тип. На D тоже по-умолчанию инты.

Dmitry
06.03.2018
09:54:12
Хотелось бы более универсальный вариант

Денис
06.03.2018
09:58:51
Хотелось бы более универсальный вариант
Ну вот есть готовый пакет с редьюсом: https://github.com/robpike/filter, но там сложно и накладные расходы на рантайм-рефлексию. А так - да, прекрасный мир сиподобных языков без перегрузки функций.

Dmitry
06.03.2018
10:05:20
Это только доказывает тезис о том, что на Го практически невозможно делать элементарные обобщения. Нельзя делать обобщения -- нельзя компактно решать задачи. Больше кода-больше ошибок. Сложнее разработка\тестирование\поддержка и тд
Даже Nim на фоне Go смотрится в разы более продуманным

Evgeny
06.03.2018
10:06:34
почему "даже"?

Dmitry
06.03.2018
10:07:46
Потому что его велосипедили люди без поддержки одной из самых крупных корпораций
И смогли сделать более продуманный язык нежели Go

Google

Denis
06.03.2018
10:21:17
у Go цель другая

Dmitry
06.03.2018
10:22:10
Какая?
Я сколько не читал про цель -- там одна вода и дешевый маркетинг
"чтобы каждый кто не осилили Си начал писать кучу кода"
"мы поставили крест на наработках в области ЯП за последние 40 лет"
Go напоминает велосипед с квадратным колесами

Денис
06.03.2018
10:24:37

Denis
06.03.2018
10:25:05
Какая?
заставить сильно средних кодеров приносить чуток пользы

Dmitry
06.03.2018
10:25:06
Си нужен для системных вещей. Go фиг пойми для чего

Pavel
06.03.2018
10:25:13

Денис
06.03.2018
10:27:54
Си нужен для системных вещей. Go фиг пойми для чего
Docker недостаточно системный? Го - это про правило 80/20. 20% инструментов - делают 80% работы, так давайте выкидывать все из языка, чья польза сомнительна и экзотична, а вот выстрелить в ногу с помощью этого легко можешь. В итоге в го сейчас ОЧЕНЬ и ОЧЕНЬ тяжело стрелять себе в ноги, компилируется - значит работает.

Dmitry
06.03.2018
10:32:53
Павел, читабельность крайне важна. Питон крайне читабельный и легкий в написани. Поэтому у него такая большая доля на рынке. На нем сложно делать ошибки именно благодаря этим качествам. Ошибки из-за типизации в рассчет не берем. Это явная проблема.

Pavel
06.03.2018
10:33:35
В отличие от всяких языков, где поведение может быть неявно переопределено с помощью метапрограммирования и алиасов всяких.

Денис
06.03.2018
10:34:32
И по поводу лапшеобразного кода - нет. В го встроен очень крутой инструментарий для тестирования, но чтобы мочь хоть что-то протестировать - это требует определенной организации кода. Так что если ты пытаешься тестировать свой код на го, то уже вынужден делать его не совсем ублюдским.

Dmitry
06.03.2018
10:34:38
Как по мне она крайне низкая по сравнению с тем же Питоном и Ди

Pavel
06.03.2018
10:34:41
Смотришь одно, а делает этот код совсем другое. А глде нибудь наверху там alias true = false. Вот это и называется нечитабельный код.

Dmitry
06.03.2018
10:34:54
Питон по читабельности вообще вне конкуренции

Maxim
06.03.2018
10:35:06
Читабельность тоже вещь субъективная, вот я с питоном так и не подружился, он у меня какое-то отторжение вызывает)

Денис
06.03.2018
10:35:31

Google

Pavel
06.03.2018
10:35:45

Dmitry
06.03.2018
10:35:57
Да и приколы Go типа:
var x int8 :=1
или как оно там пишется уже обсуждали

Maxim
06.03.2018
10:36:23
короче, у каждого языка есть свои плюсы и минусы, чего тут спорить?)

Dmitry
06.03.2018
10:36:45

Maxim
06.03.2018
10:36:49
но каким бы кривым не был дизайн го, на нем прилят софт в неимоверных количествах, и это факт)
не думаю, что гугол ловит программистов по всему миру, сажает в карцер и дает ноутбук, чтобы те разрабатывали софт ради хайпа)

Денис
06.03.2018
10:37:37
Питон по читабельности вообще вне конкуренции
Ну такое, динамическая типизация же - никогда не знаешь что прилетает тебе в функцию, ВНЕЗАПНО обнаруживаешь какие-нибудь поля, которые прицепили на объект где-то хуй знает где и для чего они.

Pavel
06.03.2018
10:39:19
Шарп и яву я понимаю, а Го с огромным трудом.
Ты скажи, что конкретно тебе не понятно в строчке
var x int8 :=1
Ты можешь понять, x - это переменная или функция?
Ты можешь понять, называется ли она x или foo?
Ты можешь понять, имеет она в памяти размер 8 бит или 42?
Ты можешь понять, ей по умолчанию присваивается значение 1 или 146?

Денис
06.03.2018
10:39:33

Maxim
06.03.2018
10:39:46
я похапе одно время возненавидел из-за динамической типизации: делаешь опечатку в переменной, и пиздец, ищи, где проблема)

Dmitry
06.03.2018
10:40:07
я не могу понять нафига еще var лепить и почему тип функции после названия переменной указан
тут это же обсуждали -- вроде бы пришли к выводу, что больше на костыль похоже

Pavel
06.03.2018
10:41:10
var - чтобы ты понял что тут объявляется переменная
новая

Денис
06.03.2018
10:41:39

Dmitry
06.03.2018
10:42:55
на много ли проще то? Да и странно делать все в угоду компилятору, а не программисту

Pavel
06.03.2018
10:44:18
Факт в том что go разработчики очень быстро вчитываются в код, это нельзя оспорить. Подтверждено тысячами хомячков.
В D код быстро вчитаться - невозможно. Если он не написан в стиле go.

Maxim
06.03.2018
10:44:53
вот честно, похоже на холивар плоские отвертки vs крестообразные

Денис
06.03.2018
10:46:11

Google

Денис
06.03.2018
10:46:27
А уж кто где тип пишет - вкусовщина

Denis
06.03.2018
10:48:21

Pavel
06.03.2018
10:48:58

Денис
06.03.2018
10:50:26

Stanislav
06.03.2018
10:51:23
товарищи, я решил всех вас замучать дурацкими вопросами :) я сам не настоящий программист, так что извиняйте если что.
принимаю в сокет байты, хочу распарсить пакет. у пакета есть основная структура (не меняющаяся), дальше идет опциональная часть с некоторым количеством TLV (type-length-value) которые идут друг за другом.
как ранее в чатике подсказали - для постоянной части сделал через структуру + union с ubyte[]. с TLV уже так не получается.
есть ли более красивый способ, чем через функцию в этой же структуре, которая будет один за одним разбирать TLV-шки?
еще отягощает что внутри tlv могут быть еще tlv.


Pavel
06.03.2018
10:53:14
Очень забавно как Dmitry сам бесконечно задает вопросы типа "А вот я прочитал что в Ди есть леворекурсивное объявление функционального квази-шаблона на стеке с иммутабельностью всех ссылок на его подтипы, для чего это сделано и где полезно?" - и ему люди даже объяснить не могут что в 1% случаев бывают кейсы в которых шаблоны дают 0.05% ошибок и для исправления этой ситуации вот такое нагородили. А писал бы на го - уже бы давно программу написал, получил деньги и даже не задавался бы вопросами где что полезно и почему.
Прочитал тип - объявил структуру, дальше прочитал размер - выделил столько байтов буфер, потом туда прочитал остаток.
Если у тебя есть возможность сначала вычитать все данные из сокета, а потом уже их целиком парсить - то тогда новую память выделять не надо, можно на старой пропарсить и получить кучу слайсов на куски


Stanislav
06.03.2018
11:01:22
я вот просто как делал до этого.
для каждого типа TLV создаю свою структуру. ну там тип в enum свой.
и там конструктор, который на вход берет uint[] и из него копируются сначала тип и длина, потом аллоцируется память и заполняется value. прочитанные байты вырезаются.
ну и в цикле пока байты не кончатся создаются объекты, складываются в массив. потом с ними и работаю.
но почему то у меня стойкое ощущение что можно проще это сделать.

Pavel
06.03.2018
11:04:35
Да врядли

Stanislav
06.03.2018
11:04:43
типа вот так (пример без union, написанный ранее)
this( ubyte[] msg )
{
this.code = msg.read!ubyte;
this.identifier = msg.read!ubyte;
this.length = msg.read!ushort;
this.authentificator = msg[ 0..16 ];
msg = msg[ 16 .. msg.length ];
ushort cur_length = cast(ushort)( this.length - 20 );
while( cur_length >= 2 )
{
writeln( msg );
ubyte cur_a = msg.read!ubyte;
ubyte cur_l = msg.read!ubyte;
ubyte[] cur_v = msg[ 0 .. cur_l-2 ];
msg = msg [ cur_l-2 .. msg.length ];
cur_length -= cur_l;
auto a = parseAVP( cur_a, cur_v );
if( a !is null )
attributes ~= a;
}
}
он конеш кривой, поэтому и переписываю его. но вроде работает.

Pavel
06.03.2018
11:05:55
Вообще это теоретически можно как-то обобщить через темплейты и аннотации, но тебе это надо? )

Stanislav
06.03.2018
11:06:44
ну вот я собираюсь с сетевыми штучками плотно заняться.
а там постоянно tlv разные. где-то 1 байт тип, 2 байта длина. где-то 8 байтов тип, 1 байт длина.
думаю хотя бы тимплейты заюзать какие-нить

Pavel
06.03.2018
11:07:04
То есть обходить все публичные свойства класса, у каждого определять тип и в соответствии с этим генерить код который в нужную переменную читаешь нужные байты из сокета. А если у переменной объявлена какая-то аннотация то парсер как-то по другому допустим парсит.
Да темплейты можно заюзать скорее всего. Но надо больше деталей задачи
Например темплейт с двумя аргументами - первый длина типа, второй длина размера последующих данных

Stanislav
06.03.2018
11:11:20
struct TLV( T, L )
{
T type;
L length;
ubyte[] value;
}
аля такой?

Google

Stanislav
06.03.2018
11:11:33
попробуем, спасибо)

Pavel
06.03.2018
11:12:37
да

Igor
06.03.2018
11:50:36

Stanislav
06.03.2018
11:53:08
ну, это дело такое. где-то network byte order, где-то нет)
пока хочу норм парсить пакеты хотя бы.

Igor
06.03.2018
11:55:57
я стараюсь как только принял пакет из сети превращать ubyte[] в immutable(ubyte)[], после чего не паришься с тем что где-то кто-то поменяет данные при обработке

Dark
06.03.2018
12:06:29
Что за пьянка была?

Maxim
06.03.2018
12:07:11
всё как обычно)

Dark
06.03.2018
12:07:50
Обычно я принимаю участие в дискуссии, но в этот раз я пролетел
Щас будем читать
И да, у тебя на мобилке менюшка не отображается - сделай лучше пикчей

Maxim
06.03.2018
12:09:24
что значит, не отображается?)

Dark
06.03.2018
12:10:52
Стоит крестик вместо меню. Тофами называются, вроде

Maxim
06.03.2018
12:11:22
что за браузер?

Dark
06.03.2018
12:11:49
Стандартный андройда версии 5.1

Maxim
06.03.2018
12:12:17
и скрин желательно, потому что всё равно не понимаю, о чем ты)

Dark
06.03.2018
12:12:57

Maxim
06.03.2018
12:13:36
а, ясно, сама менюшка-то открывается?

Dark
06.03.2018
12:13:50
Ага

Maxim
06.03.2018
12:13:56
поправлю)

Dark
06.03.2018
12:15:28
В хроме еще некрасивое подчеркивание кликнутого пункта меню
run.dlang.io замени на что-нибудь внятное, типо "Открыть в онлайн IDE"