[00:20:06] <ada_ru> (Oleg) А можно вопрос , а это для чего все?
[00:21:24] <ada_ru> (Oleg) А в чистом си разве такое есть ? Там я понимаю к void* можно привести все подряд но вот чтоб прям так что-то я не припомню
[00:24:08] <ada_ru> (I_vlxy_I) в Аде есть, в Haskell'e есть, в c++ есть (через либу). Это Алгебраический Тип Данных. Это удобно и безопасно. Безопасней чем ООП какое.
[00:24:18] <ada_ru> (I_vlxy_I) не говоря уже о void*
[00:38:55] <ada_ru> (Лекс) в pure C такого нету
[00:39:04] <ada_ru> (I_vlxy_I) в Си - нету, да
[00:39:25] <ada_ru> (I_vlxy_I) эмулируется небезопасно и через говно и палки. в ц++ -- всё ок. но хотелось бы лучше
[00:39:29] <ada_ru> (Oleg) Void* это безопасно :-) зуб даю :-)
[00:39:34] <ada_ru> (I_vlxy_I) круче всего - в хаскелле
[00:40:32] <ada_ru> (I_vlxy_I) там оно совсем развитое. например вот объявление типа-дерева:
data Tree a = Nil | Node a (Tree a) (Tree a)
[00:40:57] <ada_ru> (Oleg) А ещё я тут в исходника видел в си народ использует передачу многих аргументов , ну то есть переменное количество
[00:40:58] <ada_ru> (I_vlxy_I) ну и в Окамлах всяких тоже
[00:41:11] <ada_ru> (Oleg) Вот там тоже дыра
[00:41:43] <ada_ru> (Oleg) А в спарке то есть такое?
[00:42:11] <ada_ru> (Oleg) Понимаю что это кусок Ады но все же
[00:42:33] <ada_ru> (I_vlxy_I) дискриминирующие записи же. но дерево там, кажется, сделать нельзя, как и в Аде
[00:57:14] <ada_ru> (Лекс)  отвечает (I_vlxy_I) на <там оно совсем разви…>
ничего не понял что написано 😃
[00:58:20] <ada_ru> (I_vlxy_I)  отвечает (Лекс) на <ничего не понял что …>
c БНФ нотацией описания грамматики знаком? ну, или EBNF
[00:58:28] <ada_ru> (I_vlxy_I) тут похожий принцип
[00:58:45] <ada_ru> (Лекс) нет, этого тоже не понимаю
[00:59:50] <ada_ru> (I_vlxy_I) 🙁
[01:00:38] <ada_ru> (Oleg) Ээ
[01:00:52] <ada_ru> (Oleg) Почитал про тайпскрипт
[01:01:25] <ada_ru> (Oleg) Так а разве string|boolean это не юнион?
[01:01:59] <ada_ru> (Eugene)  отвечает (Oleg) на <А в чистом си разве …>
в си есть union
[01:02:18] <ada_ru> (Oleg) Да и я его постоянно использую :-)
[01:02:24] <ada_ru> (Oleg) Теперь понятно
[01:02:34] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <в си есть union>
у него нет типа. это говнецос
[01:03:03] <ada_ru> (I_vlxy_I) нет типа, нет паттерн матчинга, нифига нету
[01:03:24] <ada_ru> (I_vlxy_I)  отвечает (Oleg) на <Да и я его постоянно…>
а в аде записи с дискриминантом никогда не ипользовал шоле?
[01:04:09] <ada_ru> (I_vlxy_I) я удивлен, что это приходится пояснять в этом чатике. в Аде это ж есть всё
[01:04:52] <ada_ru> (Eugene)  отвечает (I_vlxy_I) на <у него нет типа. это…>
ну его можно воткнуть в struct, в котором дополнительное поле будет кодировать текущий вариант )))
[01:05:08] <ada_ru> (a) Та здесь на аде никто не пишет жеж
[01:05:21] <ada_ru> (a) Чему удивлен то
[01:05:35] <ada_ru> (a) Про Раст все время говорят
[01:05:45] <ada_ru> (a) Про си разные
[01:05:54] <ada_ru> (a) Про трактор
[01:06:19] <ada_ru> (a) Про все, короче...
[01:06:23] <ada_ru> (a) ;)
[01:06:38] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <ну его можно воткнут…>
всё равно говнецо небезопасное. Си - нинужен. Вот в c++ есть std::variant
[01:06:49] <ada_ru> (I_vlxy_I)  отвечает (a) на <Про Раст все время г…>
дык в расте это тоже есть!
[01:07:13] <ada_ru> (Eugene) в сишарп 8, кстати, добавили паттерн матчинг по типам из какой-то иерархии классов, оченно многословная эмуляция хаскельных fkunl, но хоть что-то, удобнее чем родное ООП
[01:07:14] <ada_ru> (a) Да в расте тока пива и баб нет
[01:07:31] <ada_ru> (a) А так все хорошо.
[01:07:48] <ada_ru> (I_vlxy_I) наследования там нет обычного 🙂
[01:08:19] <ada_ru> (I_vlxy_I) `enum Tree<T> {
   Empty,
   Node(T, Box<Tree<T>>, Box<Tree<T>>)
}`
[01:08:21] <ada_ru> (I_vlxy_I) вот на расте
[01:09:42] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <в сишарп 8, кстати, …>
а как они обошли принципиальную разницу между наследованием и алгебраическими типами?

алгебраические типы - это закрытый список типов, а наследование ООПшное - это неизвестное множество типов с наследованием
[01:10:03] <ada_ru> (I_vlxy_I) а вот typescript:
type Tree<T> = Empty | Node<T>;
[01:11:58] <ada_ru> (Oleg) На аде использовал записи дискриминирующие, было дело
[01:12:57] <ada_ru> (Oleg) И вот про то что на аде тут не пишут, так и на расте тоже не пишут :-) мучаются все на плюсах го питоне и JS :-)
[01:12:58] <ada_ru> (I_vlxy_I) советую постоянно дискриминировать
[01:14:16] <ada_ru> (Oleg) Потому что как только захочешь что-то сделать на аде, выясняется что нет нужной библиотеки и надо биндинги а на го все есть
[01:14:43] <ada_ru> (Oleg) И тут дилемма , долго ковыряются или быстро сделать
[01:15:18] <ada_ru> (Eugene)  отвечает (I_vlxy_I) на <а как они обошли при…>
я же тебе уже писал когда-то, что алгтд не обязаны быть закрытыми, в O'Haskell они были расширяемыми, так что всё норм
[01:15:59] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <я же тебе уже писал …>
паттерн матчинг будет говном в этом случае
[01:16:09] <ada_ru> (I_vlxy_I) а О'Хаскель это вообще неудачный экскремент
[01:20:24] <ada_ru> (Eugene) если можно расширять записи, то логично и ортогонально будет расширять и вариантный тип
[01:27:41] <ada_ru> (Oleg) А вообще мне кажется ада мало популярна в том числе и потому что объемная , хотя плюсы теперь тоже огого какие. Долго изучать. Все куда то спешат....
[01:28:16] <ada_ru> (I_vlxy_I)  отвечает (Oleg) на <А вообще мне кажется…>
просто языка давным давно мало
[01:28:31] <ada_ru> (Oleg) Ну это понятно
[01:29:17] <ada_ru> (Oleg) Пока в совсем эмбеддеде это ещё актуально, на новых чипах на которые ещё нет ничего
[01:29:58] <ada_ru> (I_vlxy_I) то есть языка настолько недостаточно, что язык без приличного пакетного менеджера и билдсистемы искаропки и приличного наполненного (и наполняемого сообществом) репозитория с либами разнообразными обречен на повышенную детскую смертность проектов на этом языке.

да что там смертность - отсутствие перечисленного это прям таки барьерная контрацепция для проектов на таком языке
[01:30:42] <ada_ru> (I_vlxy_I) поэтому остаются на плаву только уже большие проекты. либо проекты которые рождаются сразу взрослыми - в больших компаниях.
[01:38:33] <ada_ru> (I_vlxy_I) и я сейчас даже не про Аду говорил. хотя ей это тоже подходит
[02:33:52] <ada_ru> (I_vlxy_I) в общем, языки, которые не смогли в правильную компонентность могут жить только в больших проектах, где специально обученные люди для них и проекта создадут всю инфраструктуру.
[12:08:00] <ada_ru> (I_vlxy_I) rustRustRUST! https://habr.com/en/post/481070/
[12:11:12] <ada_ru> (shiz01)  отвечает (I_vlxy_I) на <даже в C++! std::var…>
Жаль, что вариант так криво сделан, через визитера.
Или свой костыль через рекурсивные шаблоны/лямбдочки.
[12:11:38] <ada_ru> (I_vlxy_I)  отвечает (shiz01) на <Жаль, что вариант та…>
свой визитор пилится за полторы минуты же
[12:12:01] <ada_ru> (I_vlxy_I) просто структура у которой перегружен оператор ()
[12:12:11] <ada_ru> (I_vlxy_I) причем для каждого из типов
[12:12:19] <ada_ru> (I_vlxy_I) без всяких шаблонов
[12:12:28] <ada_ru> (shiz01)  отвечает (I_vlxy_I) на <свой визитор пилится…>
Да, но когда я ненашел нормального паттерн матчинга из коробки для варианта, был немного удивлен.
[12:13:04] <ada_ru> (I_vlxy_I) это да. недоработочка. нюансы реализации через библиотеку, а не язык
[12:13:38] <ada_ru> (shiz01)  отвечает (I_vlxy_I) на <это да. недоработочк…>
Именно.
в расте удобней.
[12:13:49] <ada_ru> (shiz01) А в аде оно как?
[12:14:00] <ada_ru> (I_vlxy_I) через switch 🙂
[12:14:46] <ada_ru> (I_vlxy_I) https://en.wikibooks.org/wiki/Ada_Programming/Types/record#Discriminated_record
[12:14:56] <ada_ru> (I_vlxy_I) см. variant record
[12:16:25] <ada_ru> (shiz01)  отвечает (I_vlxy_I) на <через switch 🙂>
Ничего не понял, но очень интересно.
[12:16:39] <ada_ru> (shiz01) Спасибо.
[12:16:57] <ada_ru> (I_vlxy_I) короче, на уровне языка поддержка
[12:17:03] <ada_ru> (I_vlxy_I) с 1983 года 🙂
[12:17:19] <ada_ru> (shiz01)  отвечает (I_vlxy_I) на <короче, на уровне яз…>
Ляпота
[12:23:37] <ada_ru> (shiz01) Ктонибудь gnat-llvm собирал?
у меня уже третий билд не работает.
Собирается, но скомпилить даже пять строчек не может.
[12:24:40] <ada_ru> (shiz01) Рач.
[12:36:45] <ada_ru> (I_vlxy_I) дас. но дизайн языка в этой части (дискриминанты/варианты) несколько устарел.
[12:42:31] <ada_ru> (I_vlxy_I) да, дизайн конкретно устарел
[12:43:40] <ada_ru> (I_vlxy_I) вот отсюда: https://learn.adacore.com/courses/intro-to-ada/chapters/more_about_types.html#variant-records
[12:44:13] <ada_ru> (I_vlxy_I) если вот так использовать этот вариант:
`
with Variant_Record; use Variant_Record;

procedure Main is
  E : Expr := (Num, 12);
  
  procedure Test (e : in out Expr) is
  begin
     e.Left := new Expr'(Num, 42);
  end Test;
begin
  Test(e);
end Main;
`
[12:44:33] <ada_ru> (I_vlxy_I) то компилятор даже ничего и не мявкнет
[12:44:49] <ada_ru> (I_vlxy_I) а вот в рантайме будет ошибка (да, в Аде это проверяется в рантайме)
[12:46:08] <ada_ru> (I_vlxy_I) сейчас всё же в современных языках, или даже в старых функциональных, которые не моложе Ады, компилятор требует от программиста проверить тип прежде чем доступиться к полям, иначе ошибка компиляции
[12:51:27] <ada_ru> (I_vlxy_I) в этом плане, кажется, теперь даже С++ надежней
[12:53:02] <ada_ru> (shiz01)  отвечает (I_vlxy_I) на <в этом плане, кажетс…>
Особенно если static_assert-ами обмазываться.
[12:53:23] <ada_ru> (I_vlxy_I)  отвечает (shiz01) на <Особенно если static…>
да просто std::variant взять 🙂
[13:29:11] <ada_ru> (Eugene)  отвечает (I_vlxy_I) на <то компилятор даже н…>
он же там вроде предупреждения показал какие-то?
[13:30:28] <ada_ru> (Eugene) main.adb:4:04: warning: variable "E" is assigned but never read
main.adb:6:05: warning: component not present in subtype of "Expr" defined at line 4
main.adb:6:05: warning: "Constraint_Error" will be raised at run time
main.adb:6:05: warning: possibly useless assignment to "E", value might not be referenced
[13:30:48] <ada_ru> (Eugene) ./main
raised CONSTRAINT_ERROR : main.adb:6 discriminant check failed
[13:57:03] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <он же там вроде пред…>
ты прям мой код собрал, или то, что у них на веб-страничке?
[13:57:22] <ada_ru> (Eugene)  отвечает (I_vlxy_I) на <ты прям мой код собр…>
на веб-странице по твоей ссылке
[13:57:24] <ada_ru> (I_vlxy_I) я ж модифицировал его
[13:57:29] <ada_ru> (I_vlxy_I) скопипасти мой код туда
[14:02:09] <ada_ru> (Eugene)  отвечает (I_vlxy_I) на <скопипасти мой код т…>
ну, слабоватый пока в гнате статический анализатор
[14:02:43] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <ну, слабоватый пока …>
Тут не в гнате дело, а в языке
[14:02:59] <ada_ru> (I_vlxy_I) Это легальная конструкция, а должна быть нелегальной
[14:03:15] <ada_ru> (Eugene) эти дискриминантные записи — просто копипаста с паскалевских вариантных записей, вот к чему приводит игнорирование более современных систем типов, как, например, в ML-семействе
[14:05:22] <ada_ru> (I_vlxy_I) Да. И либой как в С++ не сделать.
[14:27:51] <ada_ru> (I_vlxy_I)  отвечает (Eugene) на <эти дискриминантные …>
Ну, дискриминантом то может быть и целое число от которого размер записи будет зависеть например.
[14:28:39] <ada_ru> (I_vlxy_I) То есть там таки все несколько сложнее
[14:30:49] <ada_ru> (I_vlxy_I) Я, кажется, понимаю почему сделали именно так, но сейчас очевидно, что в результате это привело к снижению надежности языка.
[14:31:35] <ada_ru> (I_vlxy_I) В любом случае, требования к надежности ЯП в то время, когда проектировалась Ада были намного менее жесткими чем сейчас.
[14:31:59] <ada_ru> (Максим)  отвечает (shiz01) на <Ктонибудь gnat-llvm …>
я собирал. но давно, как только его выкатили
[14:32:03] <ada_ru> (I_vlxy_I) (если нужен именно надежный язык)
[16:32:10] <ada_ru> (I_vlxy_I) прямо сейчас вот это вот место в Аде в плане надежности ощущается как нечто среднее между питоном и ocaml'ом, причем ближе к питоне (рантайм проверки таки). Странное ощущение 🙂
[17:08:24] <ada_ru> (shiz01)  отвечает (Максим) на <я собирал. но давно,…>
А суры первой версии остались?
Хотя ненадо, ща клонить буду по first commit.
[17:56:41] <ada_ru> (shiz01)  отвечает (Максим) на <я собирал. но давно,…>
А можешь сказать дату?
Первый коммит 2013 года.
И я сомневаюсь, что он заведется.
[17:56:44] <ada_ru> (shiz01) Примерную хотябы
[17:58:57] <ada_ru> (shiz01) ну или git log
если не обновлял, то последний коммит - твой.
[18:19:11] <ada_ru> (Максим) я  в докере делал, брал  ubuntu:19.04, там llvm 8, всё собиралось, в сеньтябре
[18:19:34] <ada_ru> (shiz01)  отвечает (Максим) на <я  в докере делал, б…>
Докерфайл есть?
[18:21:11] <ada_ru> (Максим) Вроде этот https://bitbucket.org/reznikmm/gnat/commits/ad7f94345074e9f6cb4394369cfdfd32a18c04e9?at=gnat-llvm
[18:22:01] <ada_ru> (shiz01)  отвечает (Максим) на <Вроде этот https://b…>
Спасибо.
[18:26:30] <ada_ru> (iserged)  отвечает (I_vlxy_I) на <а вот в рантайме буд…>
а в чем там проблема, а то я аду не разумею
[18:29:02] <ada_ru> (Максим)  отвечает (shiz01) на <Спасибо.>
Запустил docker build . сломалось на llvm_wrapper.cc 😕
[18:30:37] <ada_ru> (shiz01)  отвечает (Максим) на <Запустил docker buil…>
Ещё не тестил, потом буду по комиитам прыгать.
[18:32:58] <ada_ru> (Максим) > Commits on Oct 7, 2019: Update binding to LLVM 9.0.0
[18:33:08] <ada_ru> (Максим) Может там сломилось...
[18:34:58] <ada_ru> (shiz01) Щас на дженте у меня llvm ребилдится.
Соберется, попробую там.
[18:35:12] <ada_ru> (Максим) и blame на строку, где сломалось тоже указывает на этот коммит
[18:35:47] <ada_ru> (shiz01)  отвечает (Максим) на <и blame на строку, г…>
идти -1 рестами
[19:22:39] <ada_ru> (Максим) Ха ха, нарвался на дедлок в своём торрент клиенте 😊
[19:58:52] <ada_ru> (Oleg) :-)
[22:50:36] <ada_ru> (a) https://vladimir-kovalev.blogspot.com/p/scirocco_27.html?m=1 радиолюбителям ;)
[22:50:56] <ada_ru> (a) Очень уж красиво
[23:22:03] <ada_ru> (Лекс) http://sceptic-ratio.narod.ru/ma/block.htm математикам) немного о бутстрапе математики 😎