А с шаблонами не понятно. Трудно их надёжно применять, не очень понятно, как подружить с ООП.
Допустим, у нас есть
type
Exception = class
public
property InnerException: Exception;
А ещё у нас есть
type
EInOutError = class(Exception)
public
property ErrorCode: Integer;
property Path: string;
Напишите шаблон, который рекурсивно проверяет цепочку Exception.InnerException, нет ли среди них EInOutError с ErrorCode = 200.
Ещё у нас есть
type
EAggregateException = class(Exception)
public
property Count: Integer read GetCount;
property InnerExceptions[Index: Integer]: Exception read GetInnerException; default;
Напишите шаблон, который найдёт EInOutError с ErrorCode = 200 среди InnerExceptions. Потоки завершаются непредсказуемо, может быть первый, может быть последний.
Немного усложним задачу.
Для более-менее обычных интерфейсов проверка принадлежности может быть сделана через System.SysUtils.Supports:
var Descendant: IDescendant;
if Supports(Ancestor, IDescendant, Descendant) then
begin
…
end {if};
Но если работать с обёртками объектов Андроиде, то у самой обёртки может быть тип, и этот тип не полон. Чтобы тестировать сам тип объекта Андроида, надо писать примерно так:
if TJNIResolver.IsInstanceOf(Ancestor, TJDescendant.GetClsID) then
begin
var Descendant: JDescendant := TJDescendant.Wrap(Ancestor);
…
end {if};
Каким синтаксисом нужно объяснять сопоставителю шаблонов эти нюансы?
Про кодировки трудно забыть, пока про них не забыли разработчики операционных систем. Например, в Linux можно создать файл с именем из невалидной последовательности символов UTF-8. Если пытаться себя убедить, что мы попали в чудесный мир Юникода, и на Юникоде пытаться сделать файловый менеджер с рекурсивным копированием и удалением директорий, он может не открыть, не смочь рекурсивно удалить или рекурсивно скопировать директорию с такими весёлыми файлами.
Ещё в UTF-8 есть разные способы кодировать одно и то же, и в Java этим активно пользуются, чтобы кодировать нулевой unicode codepoint двумя ненулевыми байтами при преобразовании в строку, заканчивающуюся нулевым байтом. Но это может быть не только нулевой codepoint. Не так давно PostgreSQL взламывали, кодируя восклицательный знак двумя байтами UTF-8.
Может быть, думаете, в WinAPI Юникод? А что, если создать файл из невалидной комбинации суррогатных пар.
Я составил обходной лист костылей для работы с кодировками Юникода:
Это как раз пример всестороннего загаживания пространства поиска. И модули из uses в общее пространство поиска вываливаются, без варианта оставить доступ по квалифицированным именам. И весь Self в пространство поиска вываливается. И with есть только такой, вываливающий всё в общую помойку.
В случае R по-хорошему так и надо оставить R, а в случае каких-то глубоких доступов надо обязывать давать имя, и доступ только через имя точка, а не общую помойку. В языке Ада declare renames вынудит задать имя.
Такие претензии, потому что я вижу как Си, C++, Java сплелись. Gtk на Си в обёртке Gtkmm для C++, и, наоборот, для C++ библиотек обёртки на Си. На полу-C++, полу-Java софт не редкость, LibreOffice таков, там UNO есть для автоматизации связывания C++ и Java-компонент. Противники Большого Паскаля почему-то на себя такой образ мысли не примеряют, чтоб какие-то свои пути. Пути, конечно, свои, но люди знают одно, другое, третье, и перетекает. Скажем, в C99 появились агрегаты.
struct xyz {
int a;
int b;
int c;
};
struct xyz klm = { .a = 99, .c = 100 };
В C++ их не было, а потом появились, и по какому-то совпадению по синтаксису оказались такие же. Это ведь не удивляет, правда? А ещё не удивляет, когда одно и то же называется одним и тем же термином. Вот, например, в PMtW был термин method resolution order, и тот же термин перетёк в Python, и чувствуется преемственность. Хотя в CLOS то же самое называется class linearization, и такой же термин в Dylan. Чувствуется, кто с кем больше общается.
Как само собой разумеющееся, в Большом Паскале, наоборот, нет такого общения. В языке Ада всю дорогу были controlled types, но в Delphi зачем-то изобрели термин managed records.
В Java была драматичная история с борьбой разных интерфейсов к Java-машине: NMI, JRI, RNI, и устаканилось на JNI. Оберонщики любят пенять, как джава всё украла, как аж целых две джава-машины выросли из оберон-машин: Esmertec Jbed и Excelsior JET. А, допустим, меня не нужно долго уговаривать, я уже патриот Паскаля, но не какого-то конкретного Паскаля. А где мне Oberon Native Interface, чтобы сделать программу из Ады, Delphi и Оберон-машины, как LibreOffice? Что-то не видать, а в чатах предлагается «соломоново решение» просто переписать всё на один язык.
Это пусть противники Большого Паскаля объединятся в большой кулак, и этим большим кулаком наподдают каждой ветке Большого Паскаля по отдельности, а в Большом Паскале, оказывается, какие-то свои пути. В Большом Паскале надо поодиночке выйти на арену против змеиного клубка из C, C++, Objective-C, Java, C#, и торжественно всосать.
У оберонщиков чуть ли не доблесть не знать Аду, адаистам кое-чем в Delphi тоже бы стоило глаза помозолить, но не торопятся мозолить, не разбегаются.
Сама Delphi, когда перестала быть Турбо Паскалём, многое позаимствовала из Модулы-3, и это поспособствовало тому, что это стал классный язык программирования. Жаль, с тех пор такие истории не повторялись. Как уже надоели эти свои пути, которыми прикрывается культивируемое невежество.
Нравится Ада
Да разное, бывает, нравится. Бывает, нравится возможность трансляции на разные платформы. Delphi Linux есть только на x86_64, а дешёвые роутеры на OpenWrt MIPS. Себе-то я на Озоне взял QOTOM за 30т.р. с процессором Celeron и шестью логически отдельными сетевыми портами, поставил OPNsense в Proxmox, и рядом в виртуалки самый разный софт могу ставить для хитрых туннелей. А что-то массовое, как у Roterich, делается на OpenWrt MIPS, и Delphi там нет, а Ада есть.
На Windows ARM, Эльбрус 2000 Линукс так и вообще почти никак не транслироваться, кроме как через Си и C++. Такая возможность есть у AdaMagic, но этот компилятор застрял в Ada 95. Так что супер переносимый код пишется на Ada 95, конечно, если не хочется напрямую вляпываться в слабую систему типов Си(++) и почти отсутствующую систему модулей. Delphi используется там, где есть сильные позиции, в UI на более-менее типичных платформах. На Windows ARM и Эльбрус 2000 Линуксе можно Delphi UI запускать в x86 эмуляции, а сложную логику писать на Аде 95. На Авроре, пока нет Delphi ARM Linux, хотя бы адские привязки к Qt надо брать, и всё на Аде программировать.
В языке Ада пошли другим путём. Character остался Character, String остался String, а к ним добавили сначала Wide_Character и Wide_String, а потом Wide_Wide_Character и Wide_Wide_String. И они между собой не конвертируются как в Delphi, так что случайно не ошибиться. А для файлов был Ada.Text_IO, а к нему добавились Ada.Wide_Text_IO и Ada.Wide_Wide_Text_IO, но это ещё конец истории. Они объявляют файловые типы с возможностью писать Юникод той или иной ширины, но имена файлов были String, а по букве стандарта это Latin-1. То есть, если программа запущена в Windows с кодировкой 866 и открывается файл, то по букве стандарта надо Latin-1 преобразовать в Юникод простым расширением нулевыми разрядами, и вызывать W-версию WinAPI. Хорошо или плохо, в известных реализациях я такое следование букве стандарта не видел, а видел 866 в A-версию и UTF-8. Но всё-таки в комитете стандартизации задумались, а что за фигня, и сделали в каждом из трёх пакетов вложенные пакеты Wide_File_Names и Wide_Wide_File_Names. Теперь у нас девять стандартных способов открыть текстовый файл, и самый труъ-юникодный Ada.Wide_Wide_Text_IO.Wide_Wide_File_Names.Open.
Ну что, как, похоже это на язык мечты? Всё как вы хотите сделали.
Да и немасштабных не хватает. Взять бы их разработчиков, и чтобы они поизучали Аду, и просто в Delphi взяло и появилось оттуда разное хорошее. А то не знают Аду и доходит как до жирафа. И особенно большое расстройство с немасштабных изменений, про которые объявление выглядело бы непафосно, вот и не снисходят, не делают, и ещё неизвестно, сколько лет пройдёт, пока не сделают.
У меня есть и другие хотелки, до которых, кажется, не соизволят снизойти годами из-за непафосности.
Забавно, что нужный мне синтаксис существует годами, так что первая строка компилируется (но, конечно, не сработает, нужен посложнее вариант). А в обычных вызовах такого синтаксиса нет. Можно в обычном вызове написать имя параметра в комментарий, но комментарий может быть неправильным, а поддержанное синтаксисом явное указание имени параметра будет проверено.
Однострочные if и for было бы здорово запретить, как в MISRA-C и SEI CERT C++ и уж тем более чтобы это не было в IDE шаблоном по умолчанию. Никлаус Вирт пожалел, что в Паскале не сделал правильно, и в Модуле сделал как надо. В языке Ада тоже сделали как надо.
declare
Some_Value : constant Integer := (if Condition then 2 else 3);
begin
Process (Some_Value);
end;
Местные переменные улучшают читаемость, а ещё лучше местные константы. Их нужно правильно объявлять с первого раза, и в языке Ада такие конструкции начали добавлять в русле отказа от изменчивости в стандарте от 2012 года.
А в Delphi местные переменные подвезли, а местные константы не подвезли, так что выглядит как что-то не очень важное.
Сегодня я узнал про эту OSChina. Узнал я про неё, потому что пока все последствия коронабесия расхлёбывал, надолго выпал из open source, а тут дописал и попытался запушить. И не смог. Погрешил на ТСПУ и РКН, пошёл вообще открывать главный сайт OSDN, а там ничего. Начал раскапывать, выяснил, что OSChina купили OSDN, и после этого всё перестало работать. На OSDN я переносил проекты с BitBucket, после того как BitBucket прекратил хостинг Меркуриал. У OSDN всё было в порядке.
Ну что ж, надо выбирать новый хостинг Меркуриал. А у нас ведь даже есть отечественная разработка HgLab, вот только она self-hosted, а так, чтоб кто-то её хостил, такого нет. Ну, видимо, SourceHut следующая остановка.
В статье написано про сайт gitee. Из интереса открыл, и что-то он как-то тоже не работает.
У Магистра была не только 8-битная клавиатура, но и 16-битный Магистр16 с клавиатурой (внешней). В 16 битах-то есть, где разгуляться.
SEGA делала клавиатурные приставки, но 8-бит Sega Master System, а следующий раз 32-бит Sega DreamCast.
Ещё можно за импровизированную консоль посчитать старый ПК, который прокачали видеокартой NEC PC-FX GA ISA DOS/V. Это есть и консоль такая NEC PC-FX, и по мотивам консоли видеоускоритель сделали со спрайтами. В основном, видеоускорители проприетарного формата для NEC PC98, но были и для обычного ПК версии ISA, у них в названии DOS/V.
Для прозрачного проксирования HTTPS надо учесть, что старые системы не поддерживали SNI, причём, это даже не такая уж старая Windows XP. А без SNI надо изгаляться. Например, на уровне DNS выдавать под каждый домен новый IP, а потом при попытке подключиться к IP вспоминать, от какого он был домена. А когда DNS генерил IP, то DNS не знал, будет ли IP использоваться для HTTP, HTTPS или для вообще не HTTP подключения. Так что и все остальные порты надо чем-то перенаправить, чтоб шли в хороший настоящий IP. Чем такую магию творить?
У меня, допустим, в макросе исходных текстов раскраска слетала от любых русских букв. В старом LaTeX русские буквы вроде бы как тоже в какие-то макросы превращаются вроде \yo, и этот макрос ломает раскраску исходных текстов
За любимое дитя я голосовал за Factorio 2.0. А ещё Pacific Drive для тех, кому не зашли приколы второго Сталкера, а хочется аномалий. Из знакомых (относительно) игр в списке только Metro Awakening
Про выдающуюся понятность языка Си: https://c-faq.com/decl/spiral.anderson.html
В языке Ада есть case.
А с шаблонами не понятно. Трудно их надёжно применять, не очень понятно, как подружить с ООП.
Допустим, у нас есть
А ещё у нас есть
Напишите шаблон, который рекурсивно проверяет цепочку Exception.InnerException, нет ли среди них EInOutError с ErrorCode = 200.
Ещё у нас есть
Напишите шаблон, который найдёт EInOutError с ErrorCode = 200 среди InnerExceptions. Потоки завершаются непредсказуемо, может быть первый, может быть последний.
Немного усложним задачу.
Для более-менее обычных интерфейсов проверка принадлежности может быть сделана через System.SysUtils.Supports:
Но если работать с обёртками объектов Андроиде, то у самой обёртки может быть тип, и этот тип не полон. Чтобы тестировать сам тип объекта Андроида, надо писать примерно так:
Каким синтаксисом нужно объяснять сопоставителю шаблонов эти нюансы?
Не зарастает тропа от детей, желающих купить и продать сим-карту. Подержать в руках первые в жизни заработанные деньги
Про кодировки трудно забыть, пока про них не забыли разработчики операционных систем. Например, в Linux можно создать файл с именем из невалидной последовательности символов UTF-8. Если пытаться себя убедить, что мы попали в чудесный мир Юникода, и на Юникоде пытаться сделать файловый менеджер с рекурсивным копированием и удалением директорий, он может не открыть, не смочь рекурсивно удалить или рекурсивно скопировать директорию с такими весёлыми файлами.
Ещё в UTF-8 есть разные способы кодировать одно и то же, и в Java этим активно пользуются, чтобы кодировать нулевой unicode codepoint двумя ненулевыми байтами при преобразовании в строку, заканчивающуюся нулевым байтом. Но это может быть не только нулевой codepoint. Не так давно PostgreSQL взламывали, кодируя восклицательный знак двумя байтами UTF-8.
Может быть, думаете, в WinAPI Юникод? А что, если создать файл из невалидной комбинации суррогатных пар.
Я составил обходной лист костылей для работы с кодировками Юникода:
Консольные программы запускаются с 866 по умолчанию. Для переключения можно вызывать SetFileApisToANSI.
Это как раз пример всестороннего загаживания пространства поиска. И модули из uses в общее пространство поиска вываливаются, без варианта оставить доступ по квалифицированным именам. И весь Self в пространство поиска вываливается. И with есть только такой, вываливающий всё в общую помойку.
В случае R по-хорошему так и надо оставить R, а в случае каких-то глубоких доступов надо обязывать давать имя, и доступ только через имя точка, а не общую помойку. В языке Ада declare renames вынудит задать имя.
В Модула-3 синтаксис with изменён от Модулы-2, и имя стало возможным и обязательным к указанию.
Такие претензии, потому что я вижу как Си, C++, Java сплелись. Gtk на Си в обёртке Gtkmm для C++, и, наоборот, для C++ библиотек обёртки на Си. На полу-C++, полу-Java софт не редкость, LibreOffice таков, там UNO есть для автоматизации связывания C++ и Java-компонент. Противники Большого Паскаля почему-то на себя такой образ мысли не примеряют, чтоб какие-то свои пути. Пути, конечно, свои, но люди знают одно, другое, третье, и перетекает. Скажем, в C99 появились агрегаты.
В C++ их не было, а потом появились, и по какому-то совпадению по синтаксису оказались такие же. Это ведь не удивляет, правда? А ещё не удивляет, когда одно и то же называется одним и тем же термином. Вот, например, в PMtW был термин method resolution order, и тот же термин перетёк в Python, и чувствуется преемственность. Хотя в CLOS то же самое называется class linearization, и такой же термин в Dylan. Чувствуется, кто с кем больше общается.
Как само собой разумеющееся, в Большом Паскале, наоборот, нет такого общения. В языке Ада всю дорогу были controlled types, но в Delphi зачем-то изобрели термин managed records.
В Java была драматичная история с борьбой разных интерфейсов к Java-машине: NMI, JRI, RNI, и устаканилось на JNI. Оберонщики любят пенять, как джава всё украла, как аж целых две джава-машины выросли из оберон-машин: Esmertec Jbed и Excelsior JET. А, допустим, меня не нужно долго уговаривать, я уже патриот Паскаля, но не какого-то конкретного Паскаля. А где мне Oberon Native Interface, чтобы сделать программу из Ады, Delphi и Оберон-машины, как LibreOffice? Что-то не видать, а в чатах предлагается «соломоново решение» просто переписать всё на один язык.
Это пусть противники Большого Паскаля объединятся в большой кулак, и этим большим кулаком наподдают каждой ветке Большого Паскаля по отдельности, а в Большом Паскале, оказывается, какие-то свои пути. В Большом Паскале надо поодиночке выйти на арену против змеиного клубка из C, C++, Objective-C, Java, C#, и торжественно всосать.
У оберонщиков чуть ли не доблесть не знать Аду, адаистам кое-чем в Delphi тоже бы стоило глаза помозолить, но не торопятся мозолить, не разбегаются.
Сама Delphi, когда перестала быть Турбо Паскалём, многое позаимствовала из Модулы-3, и это поспособствовало тому, что это стал классный язык программирования. Жаль, с тех пор такие истории не повторялись. Как уже надоели эти свои пути, которыми прикрывается культивируемое невежество.
Да разное, бывает, нравится. Бывает, нравится возможность трансляции на разные платформы. Delphi Linux есть только на x86_64, а дешёвые роутеры на OpenWrt MIPS. Себе-то я на Озоне взял QOTOM за 30т.р. с процессором Celeron и шестью логически отдельными сетевыми портами, поставил OPNsense в Proxmox, и рядом в виртуалки самый разный софт могу ставить для хитрых туннелей. А что-то массовое, как у Roterich, делается на OpenWrt MIPS, и Delphi там нет, а Ада есть.
На Windows ARM, Эльбрус 2000 Линукс так и вообще почти никак не транслироваться, кроме как через Си и C++. Такая возможность есть у AdaMagic, но этот компилятор застрял в Ada 95. Так что супер переносимый код пишется на Ada 95, конечно, если не хочется напрямую вляпываться в слабую систему типов Си(++) и почти отсутствующую систему модулей. Delphi используется там, где есть сильные позиции, в UI на более-менее типичных платформах. На Windows ARM и Эльбрус 2000 Линуксе можно Delphi UI запускать в x86 эмуляции, а сложную логику писать на Аде 95. На Авроре, пока нет Delphi ARM Linux, хотя бы адские привязки к Qt надо брать, и всё на Аде программировать.
В языке Ада пошли другим путём. Character остался Character, String остался String, а к ним добавили сначала Wide_Character и Wide_String, а потом Wide_Wide_Character и Wide_Wide_String. И они между собой не конвертируются как в Delphi, так что случайно не ошибиться. А для файлов был Ada.Text_IO, а к нему добавились Ada.Wide_Text_IO и Ada.Wide_Wide_Text_IO, но это ещё конец истории. Они объявляют файловые типы с возможностью писать Юникод той или иной ширины, но имена файлов были String, а по букве стандарта это Latin-1. То есть, если программа запущена в Windows с кодировкой 866 и открывается файл, то по букве стандарта надо Latin-1 преобразовать в Юникод простым расширением нулевыми разрядами, и вызывать W-версию WinAPI. Хорошо или плохо, в известных реализациях я такое следование букве стандарта не видел, а видел 866 в A-версию и UTF-8. Но всё-таки в комитете стандартизации задумались, а что за фигня, и сделали в каждом из трёх пакетов вложенные пакеты Wide_File_Names и Wide_Wide_File_Names. Теперь у нас девять стандартных способов открыть текстовый файл, и самый труъ-юникодный Ada.Wide_Wide_Text_IO.Wide_Wide_File_Names.Open.
Ну что, как, похоже это на язык мечты? Всё как вы хотите сделали.
Да и немасштабных не хватает. Взять бы их разработчиков, и чтобы они поизучали Аду, и просто в Delphi взяло и появилось оттуда разное хорошее. А то не знают Аду и доходит как до жирафа. И особенно большое расстройство с немасштабных изменений, про которые объявление выглядело бы непафосно, вот и не снисходят, не делают, и ещё неизвестно, сколько лет пройдёт, пока не сделают.
У меня есть и другие хотелки, до которых, кажется, не соизволят снизойти годами из-за непафосности.
Забавно, что нужный мне синтаксис существует годами, так что первая строка компилируется (но, конечно, не сработает, нужен посложнее вариант). А в обычных вызовах такого синтаксиса нет. Можно в обычном вызове написать имя параметра в комментарий, но комментарий может быть неправильным, а поддержанное синтаксисом явное указание имени параметра будет проверено.
Однострочные if и for было бы здорово запретить, как в MISRA-C и SEI CERT C++ и уж тем более чтобы это не было в IDE шаблоном по умолчанию. Никлаус Вирт пожалел, что в Паскале не сделал правильно, и в Модуле сделал как надо. В языке Ада тоже сделали как надо.
UPD. Со знаком = компилируется
Где это критически нужно:
Местные переменные улучшают читаемость, а ещё лучше местные константы. Их нужно правильно объявлять с первого раза, и в языке Ада такие конструкции начали добавлять в русле отказа от изменчивости в стандарте от 2012 года.
А в Delphi местные переменные подвезли, а местные константы не подвезли, так что выглядит как что-то не очень важное.
К истории вопроса, идущей корнями в Алгол 60
http://www.ada-auth.org/standards/12rat/html/Rat12-3-2.html
Так в 2ГИС бы посмотрели
Про неизменяемые КЧ деревья и другие структуры могу посоветовать книгу: Окасаки К. Чисто функциональные структуры данных
Сегодня я узнал про эту OSChina. Узнал я про неё, потому что пока все последствия коронабесия расхлёбывал, надолго выпал из open source, а тут дописал и попытался запушить. И не смог. Погрешил на ТСПУ и РКН, пошёл вообще открывать главный сайт OSDN, а там ничего. Начал раскапывать, выяснил, что OSChina купили OSDN, и после этого всё перестало работать. На OSDN я переносил проекты с BitBucket, после того как BitBucket прекратил хостинг Меркуриал. У OSDN всё было в порядке.
Ну что ж, надо выбирать новый хостинг Меркуриал. А у нас ведь даже есть отечественная разработка HgLab, вот только она self-hosted, а так, чтоб кто-то её хостил, такого нет. Ну, видимо, SourceHut следующая остановка.
В статье написано про сайт gitee. Из интереса открыл, и что-то он как-то тоже не работает.
У Магистра была не только 8-битная клавиатура, но и 16-битный Магистр16 с клавиатурой (внешней). В 16 битах-то есть, где разгуляться.
SEGA делала клавиатурные приставки, но 8-бит Sega Master System, а следующий раз 32-бит Sega DreamCast.
Ещё можно за импровизированную консоль посчитать старый ПК, который прокачали видеокартой NEC PC-FX GA ISA DOS/V. Это есть и консоль такая NEC PC-FX, и по мотивам консоли видеоускоритель сделали со спрайтами. В основном, видеоускорители проприетарного формата для NEC PC98, но были и для обычного ПК версии ISA, у них в названии DOS/V.
Для прозрачного проксирования HTTPS надо учесть, что старые системы не поддерживали SNI, причём, это даже не такая уж старая Windows XP. А без SNI надо изгаляться. Например, на уровне DNS выдавать под каждый домен новый IP, а потом при попытке подключиться к IP вспоминать, от какого он был домена. А когда DNS генерил IP, то DNS не знал, будет ли IP использоваться для HTTP, HTTPS или для вообще не HTTP подключения. Так что и все остальные порты надо чем-то перенаправить, чтоб шли в хороший настоящий IP. Чем такую магию творить?
У меня, допустим, в макросе исходных текстов раскраска слетала от любых русских букв. В старом LaTeX русские буквы вроде бы как тоже в какие-то макросы превращаются вроде \yo, и этот макрос ломает раскраску исходных текстов
Да из-за этой физики жидкостей у меня грибница проседает до 20 UPS. Впрочем, я так точно и не знаю, от чего больше всего проседает UPS в грибнице
За любимое дитя я голосовал за Factorio 2.0. А ещё Pacific Drive для тех, кому не зашли приколы второго Сталкера, а хочется аномалий. Из знакомых (относительно) игр в списке только Metro Awakening