С учётом того, что это должно быть удобным (иначе кто так будет писать?), то либо кортежи обязательны, либо структуры должны быть существенно переработаны.
С рекордами можно жить (я в С++ живу, хотя там есть boost::tuple). Писанины чуть больше, зато поля именованы, зачастую это повышает читабельность. Существенной переработки применительно к оберону не надо, достаточно иметь синтаксис для инициализации рекордов (так же как и массивов). Этот недостающий сахар уже обсуждали - без него неудобно и в классическом обероне.
Я просил привести весь код, но создаётся впечатление, что многое всё же недосказано.
Ну трудно писать на гипотетическом языке, если что-то непонятно - проще пояснить словами.
Что такое TypeOptional - фишка языка, позволяющая прилепливать к типу слово Optional, после чего получаем особый тип? Или он всё же где-то объявлен, тогда где его код?
Это что-то типа:
TYPE TypeOptional = OPTIONAL INTEGER;
или
typedef optional int TypeOptional;
Лихо Вы объединили тернарный оператор и кортежи в один пункт,
Оно не принципиально
Хотя тернарный оператор все же нужнее.
полагаю, что 2-е намного сложнее 1-го. Также думаю, что без них нельзя, иначе фишка будет не удобной.
Чего ж там сложного
Компилятор уже умеет иметь дело с временными переменными (для вычисления выражений). Объявление по месту - такая же временная переменная.
Полагаю, что кое-что забыто (я не прогонял это тщательно в уме):
Отказ от статических структур и от структур как таковых, одни объекты, либо добавление хитрых механизмов для работы с ними.
Не, не понял. Что такое статические структуры?
Добавление конструкторов, да не простых, а с инициализацией всех данных объекта.
Не. Можно без конструкторов. Просто синтаксис для инициализации рекордов. Если полей много - делается обычная вспомогательная функция-конструктор. Ничего в язык добавлять не надо.
Объявление данных модуля с инициализацией.
Отказ от данных модуля, которые не могут быть инициализированы по месту.
Не, не понял. Обсуждаемые свойства никак не мешают данным модуля - всегда есть OPTIONAL. Просто теперь все будет явно: если данные модуля не могут быть проиничены самостоятельно - то они OPTIONAL.
Как-то придумать инциализацию по месту массивов, или отказ от них.
Да, да. Давно пора нормально инициализировать массивы
Если массив большой - да, есть проблема в дополнительных накладных расходах. Но мне не кажется, что это что-то принципиальное. Ну зачем может быть нужен неинициализированный большой массив? Жуткую матрицу посчитать? Так оно считать будет много дольше, чем инициализировать.
Отказ от 1-го RETURN (Оберон ведь движется в этом направлении)
А может это неправильное направление?
Возможно, что-то ещё.
Про исключения не понял, почему нельзя возвращать код ошибки вместе с результатом?
Потому что результат будет "мусорным" в случае ошибки. А мы не хотим мусорных значений.
По-моему вырисовывается не диалект Оберона, а совсем другой язык.
Да ладно. До какого-нибудь С++ или жабы такому диалекту очень далеко
А определенные проблемы решаются.
Предложу свои варианты ответов:
1.При необходимости многие будут не выкручиваться в эквивалентные преобразование кода, а инициализировать по месту мусорно, что затруднит обнаружение ошибки, в случае если переменная так и не будет проинициализирована нормально (за что боролись, на то и напоролись).
Да вы никогда не заставите писать правильно. Но вот если писать правильно будет
проще, чем неправильно, то среди неправильных программистов с накоплением опыта будет определенная миграция в правильную сторону. Например, проинитить указатель нулем уже не получится. Придется писать OPTIONAL, а потом явно приводить такой указатель к ненулевому. Глядишь, подумают чуть-чуть, и сделают так, что указатель сразу будет инициализирован чем-то осмысленным.
2.Усложнение языка и компилятора, ради небольшой проблемы. Ведь изначально шла речь о простом изменении, существенно более простом, чем то, что реализовано в анализаторе BlackBox или компиляторе java. А если нам нужен другой язык, с кортежами, исключениями, nullable типами и другими фишками, это другой вопрос.
В приведенном вами примере - компилятор ничего не сможет сделать. Придется инитить мусором, чтобы его заткнуть. В чем мы выиграли?
3.Возможно, что-то ещё. Мне не так-то просто предвидеть все последствия от необходимых изменений.
В том, что я описал, нет ничего нового. Оно в том или ином виде присутствует в существующих ЯП. Так что каких-то злобных последствия я не предвижу.