[01:34:42] <OCTAGRAM> превозмог http://objective.pe/test в браузере смотрю, вроде приличный шаблон выбрал
[01:39:44] <ada_ru> (Максим) я хз как в нём разобраться...
[01:44:28] <OCTAGRAM> да просто границу окна подвигать и смотреть
[03:42:32] <ada_ru> (I_vlxy_I) "Ada (1980, последний действующий стандарт 2016)"
"Недостаток Ады кроме сложности — чрезмерная многословность, что впрочем было задумано в угоду читаемости. Из-за специфичности языковой модели безопасности, интеграция с “чужими” библиотеками затруднена."
[03:42:36] <ada_ru> (I_vlxy_I) На хабр немного ереси завезли
[03:42:43] <ada_ru> (I_vlxy_I) https://habr.com/en/post/442372/
[03:43:13] <ada_ru> (I_vlxy_I) <прислал наклейку> 😝
[04:05:17] <ada_ru> (coopht) Почему в GPS, когда выделяешь текст и жмакаешь правой кнопкой мыши, в меню есть все что угодно, кроме копировать и вставить
[07:19:02] <ada_ru> (coopht) А есть Адисты в ЧАТИ?
[07:19:42] <ada_ru> (coopht) Как на Аде так же сделать?
for (i = 0; i < 10; i++)
   val |= (1<<(31-i));
[09:22:08] <ada_ru> (nitrocerber)  отвечает (coopht) на <Почему в GPS, когда …>
Ctrl+c ctrlv+v отменили?)
[10:01:09] <ada_ru> (Максим)  отвечает (coopht) на <Почему в GPS, когда …>
Включи там в плагинах есть
[12:57:43] <ada_ru> (Максим)  отвечает (coopht) на <Как на Аде так же сд…>
Если "дословно" то так
[12:57:49] <ada_ru> (Максим) use all type Interfaces.Unsigned_32;
  Val : Interfaces.Unsigned_32;
begin
  for J in 0 .. 9 loop
     Val := Val or Shift_Left (1, J);
  end loop;
[12:59:06] <ada_ru> (Максим) Но можно на более высоком уровне. Если логически это у тебя массив бит, то лучше так и объявить. Компилятор упакует его в слово и машинный код будет примерно тем же
[13:00:29] <ada_ru> (Максим) type Bit_Set is array (0 ..31) of Boolean
    with Pack;
  Val : Bit_Set;
begin
  Val := Val or (0 .. 9 => True, 10 .. 31 => False);
[13:02:06] <ada_ru> (Максим) А если эти 9 бит это значение какого-то типа, например целого, и является частью, добустим регистра какого-то, то лучше его так и объявить с помощью "битовых полей" записи. В Ada Drivers Library есть готовые интересные примеры
[13:05:15] <ada_ru> (Максим) Вот, например, автогенеренный по SVD текст https://github.com/AdaCore/Ada_Drivers_Library/blob/master/arch/ARM/STM32/svd/stm32f40x/stm32_svd-i2c.ads
[13:55:44] <ada_ru> (I_vlxy_I) А напомните ещё раз, зачем в Аде разделение на процедуры и функции?
[13:57:20] <ada_ru> (I_vlxy_I) Почему например не как в том же расте или Го?
[13:57:51] <ada_ru> (I_vlxy_I) (про си не говорю из за сильно разного синтаксиса для функций)
[14:00:21] <ada_ru> (Gourytch) чтобы для оптимизации не заморачиваться возвращением результата, например. но это наобум, не точно.
[14:00:56] <ada_ru> (nitrocerber) Предикаты писать удобнее функциями)
[14:02:49] <ada_ru> (nitrocerber) Вообще интересно, люди в 80ых вообще задавались таким вопросом: а можно ли по-другому, без разделения
[14:02:53] <ada_ru> (I_vlxy_I) А чем удобней чем если бы были только функции? Как в том же Го. Просто функция может не возвращать значения.
[14:03:05] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Вообще интересно, лю…>
Си уже был
[14:04:42] <ada_ru> (nitrocerber) Ну вдруг ты обдолбос, у тебя есть две функции с одинаковым профилем, но разными ретёрнами. Позвал ты её как процедуру... И що будет?
[14:05:14] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Ну вдруг ты обдолбос…>
Ошибка компиляции :-)
[14:06:08] <ada_ru> (nitrocerber) Ну и опять же философия "явности"
[14:06:43] <ada_ru> (nitrocerber) Хочешь позвать функцию ради сайд эффекта, сделай Dummy := F (x);
[14:08:02] <ada_ru> (Максим) Кроме процедур и функций в Аде есть еще "входы"!
[14:09:44] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <Кроме процедур и фун…>
O_O
[14:21:42] <ada_ru> (Gourytch) "на-а-ачное  Rendez-vouz в середине таски =)"
[14:22:28] <ada_ru> (Максим) Входы есть у задач и "защищенных объектов". В задачах - это место где пересекаются две задачи, когда "общаются". В защищенных объектах это "процедура" которая может иметь условие для входа выраженное через состояние объекта
[14:23:40] <ada_ru> (Максим) типа, если это защищенный стек, то условие может быть "стек не пуст" и тогда можно висеть на этом входе и ждать пока условие выполниться. Можно ждать с таймаутом или сразу несколько входов
[14:25:36] <ada_ru> (Gourytch) а входы - (ENTRY) они в фортране, например
[15:22:07] <ada_ru> (nitrocerber) А выхода нет
[15:22:15] <ada_ru> (nitrocerber) Полный привет
[15:22:41] <ada_ru> (nitrocerber) Питон поставь и по ле те ли
[15:22:45] <ada_ru> (nitrocerber) Извините
[16:18:54] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Хочешь позвать функц…>
Не, ну а процедуры то зачем?
[16:19:20] <ada_ru> (nitrocerber) Чтобы звать без dummy :=
[16:19:30] <ada_ru> (I_vlxy_I) Офигеть :-)
[16:19:44] <ada_ru> (I_vlxy_I) Ну, пусть функция возвращает ничего :-)
[16:20:32] <ada_ru> (FROL256) не ну так процедуры могут иметь сайд эффект, а функции нет, разве не в этом смысл?
[16:20:40] <ada_ru> (I_vlxy_I) Точнее - bottom type возвращает
[16:21:00] <ada_ru> (I_vlxy_I)  отвечает (FROL256) на <не ну так процедуры …>
Функции тоже могут сайдэффектить
[16:21:25] <ada_ru> (FROL256) эм .... странно ... я всегда думал что не могут, ок, спс! )
[16:21:31] <ada_ru> (FROL256) надо будет поразбираться
[16:22:04] <ada_ru> (FROL256) ну я в коде стараюсь так разделять, что если есть выходные параметры или сайд эффект то это процедура
[16:22:12] <ada_ru> (FROL256) а если чисто тайд, то э\то функция
[16:22:45] <ada_ru> (coopht)  отвечает (Максим) на <type Bit_Set is arra…>
Спасибо!
[16:23:51] <ada_ru> (I_vlxy_I) Для всяких ограничений часто дополнительные модификаторы юзают. От pure и const до коньтрактов, как в спарке
[16:23:59] <ada_ru> (I_vlxy_I) В разных языках
[16:24:33] <ada_ru> (I_vlxy_I) Кажется, что держать function и procedure в языке это одновременно и избыточно и недостаточно.
[16:24:53] <ada_ru> (I_vlxy_I) Сейчас такой дизайн выглядит странно
[16:25:17] <ada_ru> (Максим) функции - часть выражения. процедуры - нет. для этого их синтаксически разделили
[16:25:32] <ada_ru> (FROL256) ну вот если вы function был чистым всегда тогда не странно
[16:25:40] <ada_ru> (FROL256) мне наоборот такое разделение нравится
[16:26:01] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <функции - часть выра…>
А практическая польза с этого какая?
[16:26:02] <ada_ru> (FROL256) а в каких ситуайциях функции могут иметь сайд эффект?
[16:26:34] <ada_ru> (Максим) синтаксисом подчеркнуть семантическую разницу
[16:27:12] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <синтаксисом подчеркн…>
Это же провоцирует возвращать значения через аргументы.
[16:27:26] <ada_ru> (I_vlxy_I) И код менее гибок становится.
[16:28:14] <ada_ru> (Максим)  отвечает (FROL256) на <а в каких ситуайциях…>
вот тут немного есть об этом http://www.ada-ru.org/rat2012/1-3-3
[16:31:06] <ada_ru> (FROL256) спс! Да, а какая хорошая идея была ...
[16:31:23] <ada_ru> (Максим)  отвечает (I_vlxy_I) на <И код менее гибок ст…>
Гибкость? это после которой приходиться писать статьи типа "Распутываем спагетти-код: как писать поддерживаемый JavaScript" ? Нет спасибо
[16:34:49] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <Гибкость? это после …>
Как это может привести к спагетти коду?
[16:35:04] <ada_ru> (I_vlxy_I) От какого типа ошибок такое разделение спасает?
[16:41:52] <ada_ru> (nitrocerber) Ну, справедливости ради, кое-кто писал end then Callback, где коллбэки имели явный сайд эффект, и false не возвращали никогда, так что если кто-то хочет, то гавно он напишет на любом языке))
[16:45:22] <ada_ru> (I_vlxy_I) Пока это смотрится примерно как class и struct в плюсах. Но только их ещё стесняются сделать идентичными.
[16:48:44] <ada_ru> (Максим)  отвечает (I_vlxy_I) на <От какого типа ошибо…>
Например, препятствует писать программы, которые зависят от порядка вычисления выражений
[16:49:54] <ada_ru> (Максим) процедура имеет сайд эффекты. добавить возможность использовать её в выражениях - позволить напороться на такие грабли
[16:52:57] <ada_ru> (Максим)  отвечает (nitrocerber) на <Извините>
Да всегда пожалуйста! У меня такое же настроение после идеи Н. переписать тест-драйвер с Ады на питон
[16:53:36] <ada_ru> (nitrocerber) Оу. Печаль.
[16:53:58] <ada_ru> (nitrocerber) Питон всегда, питон везде - и мир пойдёт наш по.... Адресу
[16:55:11] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <Например, препятству…>
Но синтаксически то зачем? Добавь pure/const/контракт и всё.
[16:56:25] <ada_ru> (Максим) разные вещи - пусть выглядят по разному
[16:56:45] <ada_ru> (Максим) выражения по одному, операторы - по другому
[16:59:54] <ada_ru> (I_vlxy_I) И если бы в Аде функции ВСЕГДА были бы чистыми, каков хаскелле, то это имело бы смысл. А так...
[17:00:35] <ada_ru> (FROL256) ну значит надо взять за правило писать в контракте что это чистая функция
[17:00:38] <ada_ru> (FROL256) и тогда всё путём?
[17:02:29] <ada_ru> (Максим) пока это уменьшает возможность наделать ошибок, это имеет смысл
[17:07:37] <ada_ru> (Максим) если объединять всё, что можно объединить, получим в итоге неюзабельную лямда-алгебру или лисп какой-нибудь
[17:16:38] <ada_ru> (I_vlxy_I) аргумент, что функция возвращающая значение по умолчанию имеет трудности с реализацией сайд эффектов -- принимается. я согласен, что такие умолчательные трудности это хорошо.
[17:17:24] <ada_ru> (I_vlxy_I) и, в принципе, разное ключевое слово для таких функций и функций которые значение не возвращают (а потому не имеют трудностей с сайд эффектами) -- должно ускорять обучение.
[17:18:45] <ada_ru> (I_vlxy_I) хотя, мне кажется, что можно было бы идею как-то дожать до конца.

ну и для функций возвращающих значение через аргументы (aka "процедуры"), в месте вызова оных функций явным образом помечать какие из аргументов на самом деле не на вход, а на выход.
[17:18:58] <ada_ru> (I_vlxy_I) например в том же шарпе это сделано
[17:26:14] <ada_ru> (I_vlxy_I) погодите. ну вот же, функция имеет явный сайдэффект. вообще без проблем. https://godbolt.org/z/jTGMKZ
[17:26:23] <ada_ru> (I_vlxy_I) где ж там ограничения то?
[17:28:58] <ada_ru> (Максим) я же не говорю, что функции в Аде не имеют сайд эффектов. Я говорю, что процедуры их имеют, (почти) всегда. Поэтому разрешить процедуры в выражениях - увеличить вероятность ошибки
[17:29:29] <ada_ru> (I_vlxy_I) https://godbolt.org/z/RmAsmy
[17:29:31] <ada_ru> (I_vlxy_I) и даже так
[17:29:47] <ada_ru> (Максим) Хочешь ограничение на чистую функцию - положи ее в пакет и в пакете напиши pragma Pure;
[17:31:08] <ada_ru> (I_vlxy_I) да, блин. представь себе что у тебя нету процедур. есть только функции (могущие не возвращать значение вовсе). И представь себе что у тебя Pure для них по умолчанию.

А чтобы был сайд эффект, то тебе нужно было бы это явным образом обозначить (скажем модификатором или прагмой).

Вопрос: разве так не было бы надежней?
[17:31:59] <ada_ru> (I_vlxy_I) после вот выше описанных экспериментов, мне снова кажется, что разделение (синтаксическое) на функции и процедуры в Аде это какой-то рудимент некой идеи. А сейас оно уже давно не нужно.
[17:32:13] <ada_ru> (I_vlxy_I) не нужно и никак не спасает.
[17:33:27] <ada_ru> (Максим) а разделение на выражения и операторы, тоже не нужно?
[17:33:51] <ada_ru> (I_vlxy_I) на statements & expressions?
[17:34:03] <ada_ru> (Максим) да
[17:37:14] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <да>
ну, я бы сказал, что надо всё выкинуть и оставить только expressions, а statements не нужны. Но, однако поскольку с хаскеллем я возился, могу сказать, что такой подход потребует очень продвинутой системы типов и программирование резко усложняется (слишком много ошибок компиляции на юзера свалится). Хотя надежность, конечно, повышается.

но если мы про практическое программирование, то я бы пока от такого воздержался.
[17:40:15] <ada_ru> (Максим) по моему опыту чистых функций довольно мало. в любой момент кто-то захочет добавить Put_Line в функцию, чтобы посмотреть, что там происходит без дебагера и это ломает всю цепочку зависимостей
[17:40:44] <ada_ru> (I_vlxy_I) угу. поэтому в хаскелле и начитается камасутро с монад-трансформерами
[17:41:13] <ada_ru> (Максим) В Аде следующим после Pure ограничений идет Preelaborate, так даже их в AdaCore практически не используют
[17:42:12] <ada_ru> (Максим) (это значит, что инициализация пакта делается в момент компиляции, а не в момент исполнения)
[17:46:53] <ada_ru> (I_vlxy_I) ну, тогда тем более я не вижу смысла в разделении функций и процедур синтаксическом и семантическом. у них по факту остается ровно одно отличие — одно возвращает значение, а другое нет.

но иногда мне хочется сделать, чтобы процедура возвращала значение (например кот ошибки).

еще, наверное, одно отличие, что функция (в Ада-понятиях) возвращает одно значение, а процедура — несколько (редко ровно одно). В этом случае в том же Го забавно сделано — если функция возвращает больше одного значения, то в выражении её испольовать нельзя. https://godbolt.org/z/Ied0oc
[17:48:40] <OCTAGRAM> а зачем соединять их?
[17:49:05] <OCTAGRAM> кажется, функция больше про скажи, а процедура больше про сделай
[17:49:25] <OCTAGRAM> читаешь, и глаз радуется
[17:49:31] <OCTAGRAM> зачем менять
[17:50:09] <ada_ru> (I_vlxy_I) ды не читаешь же. ты чаще читаешь место где они используются. а там они никак не различимы.

ну, короче, всё это странно выглядит.
[17:53:36] <ada_ru> (I_vlxy_I) и если вдруг обработка ошибок через исключения не эффективна в данном конкретно месте, то придется либо всё на функции перефигачивать, либо код ошибки возвращать через аргументы, что уродливо, ибо не явно.
[17:53:51] <ada_ru> (coopht) Максим а можешь объяснить почему это не работает ?
procedure Main is
   Val : Interfaces.Unsigned_32 := 0;

   function To_Integer is
       new Ada.Unchecked_Conversion (Source => Interfaces.Unsigned_32,
                                     Target => Integer);

begin
   for Idx in Integer range 0 .. 10 loop
       Val := Val or (Shift_Left (1, 31 - Idx));
       Put(To_Integer(Val), Base => 16);
       New_Line;
   end loop;
end Main;
[17:54:00] <ada_ru> (coopht) -16#80000000#
-16#40000000#
-16#20000000#
-16#10000000#
-16#8000000#
-16#4000000#
-16#2000000#
-16#1000000#
-16#800000#
-16#400000#
-16#200000#
Вот что печатается
[17:55:23] <ada_ru> (coopht) Я ожидал чего-то подобного
0x80000000
0xc0000000
0xe0000000
0xf0000000
0xf8000000
0xfc000000
0xfe000000
0xff000000
0xff800000
0xffc00000
[17:55:31] <ada_ru> (coopht) блин, совсем аду забыл 😞
[17:56:55] <ada_ru> (coopht) а, я знаю почему
[17:57:27] <ada_ru> (Максим) вроде как старший бит - 1
[17:59:20] <ada_ru> (Максим) сделай package Unsigned_IO is new
    Ada.Text_IO.Modular_IO (Interfaces.Unsigned_32);
[17:59:42] <ada_ru> (Максим) и используй Put из него, вместо Unchecked_Conversion
[18:02:36] <ada_ru> (coopht) Ага, спасибо
[18:02:39] <ada_ru> (coopht) так и сделал
[18:06:04] <OCTAGRAM> в месте, где они используются, нельзя отличить стоящую на первом месте процедуру от  стоящей в середине функции?
[18:07:50] <OCTAGRAM> Idx in 0 .. 10 loop тоже сойдёт
[18:16:35] <ada_ru> (coopht)  отвечает на <(OCTAGRAM) Idx in 0 …>
это мелочи )
[20:30:49] <ada_ru> (I_vlxy_I) Сортировка на расте, где повыкинул всё лишнее: https://godbolt.org/z/MR9nwI
[20:31:06] <ada_ru> (I_vlxy_I) ну, или почти всё лишнее
[20:35:33] <ada_ru> (I_vlxy_I) https://godbolt.org/z/8l_2U6
[20:35:39] <ada_ru> (I_vlxy_I) вот ещё повыкинул лишнее
[20:35:52] <ada_ru> (I_vlxy_I) Теперь надо на Аде попробовать
[20:53:02] <ada_ru> (nitrocerber) Оператор > кстати тоже не нужен, можно юзать < и аргументы переставить. Однако, зачем-то его оставляют)
[20:53:45] <ada_ru> (nitrocerber) Унарный минус тоже
[20:53:58] <ada_ru> (nitrocerber) Всё повыкидывать! Дайош блямбды
[21:22:22] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Оператор > кстати то…>
Ну, кстати, да. Оператор > почти не используется.
[21:22:50] <ada_ru> (I_vlxy_I) А вот оператор <=> штука полезная
[21:23:39] <ada_ru> (nitrocerber)  отвечает (I_vlxy_I) на <Ну, кстати, да. Опер…>
Хз, я не оч задумываюсь, что из двух первым ставить
[21:23:49] <ada_ru> (nitrocerber)  отвечает (I_vlxy_I) на <А вот оператор <=> ш…>
Шоэто
[21:24:01] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Шоэто>
Spaceship :-)
[21:24:11] <ada_ru> (nitrocerber) Nani?
[21:24:15] <ada_ru> (I_vlxy_I) Выдаёт -1, 0, 1
[21:24:22] <ada_ru> (I_vlxy_I) Сразу
[21:24:32] <ada_ru> (I_vlxy_I) В новых плюсах будет вот
[21:25:08] <ada_ru> (nitrocerber) Обоже. Зачем это нужнл?
[21:25:26] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Хз, я не оч задумыва…>
В алгоритмах всяких типа сортировки обычно просто < юзают. В дженериках/шаблонах
[21:25:39] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Обоже. Зачем это нуж…>
Для эффективности
[21:26:24] <ada_ru> (nitrocerber) Для эффективности надо писать в машинных кодах. Всё остальное - полумеры)
[21:27:33] <ada_ru> (I_vlxy_I)  отвечает (nitrocerber) на <Для эффективности на…>
Алгоритмическая же.
[21:28:58] <ada_ru> (I_vlxy_I) Чот последний растокод мой кажется лажу вместо ответа выдает