Что-то я сбился с фокуса дискуссии.
Утверждалось, что присвоение переменным фиксированных структурных значений слишком громоздское и ненаглядное по сравнению с конструкторами, которых в языке нет. А инициализация структурных констант вообще невозможна.
Я возразил:
существующими средствами языка создание структурных
фиксированных значений возможно почти также кратко и наглядно, как и через конструкторы. Оно возможно через строки. Строка - самый компактный конструктор, потому что лексический.
Конструктор-выражение отображаемое
одной такой строкой не должно использовать имена полей (в конструкторах записей), идентификаторы и операции, а только лишь литеральные константы и подконструкторы - тогда значение выражения фиксированно его текстовым представлением. Впрочем, можно еще использовать предопределенные идентификаторы констант, функций и операций, т.к. возможно автономное распознание их значений.
Да, проверка внутренности этих строк на синтакис и допустимость значений невозможна при компиляции, как это имеет место для конструкторов. Но если нужно получить фиксированное (текстом строки) структурное значение, то проверка корректности задающей его константной строки возможна уже при загрузке, если проверка идет в теле модуля.
Впрочем, если конструктор-выражение содержит идентификаторы, то увы, оно отбражается более громоздко - конкатенацией подстрок, где подвыражения с идентификаторами преобразованы функцией в строчные значения. Замена конструкторам не полноценная.
Если это конструктор-выражение содержит только идентификаторы-константы, то отображающее его строковое выражение опять же имеет фиксированное значение, а его корректность проверяется при загрузке, если проверка идет в теле модуля.
Если содержит идентификаторы-переменные, то такое конструктор-выражение задает переменное структурное значение, а отображающее его строковое выражение при загрузке проверить на корректность уже нельзя.
Когда же я говорил об избавлении от числовых литералов и о выражении чисел через строки, это уже другая тема. Я имел ввиду
изменение языка, когда преобразующие функции "строка в число" становятся
предопределенными, и значит могут использоваться в константных выражениях.
Ну, э... Например компилятор. В других языках такое возможно.
Если нам нужно не просто компактное и наглядное получение фиксированных структурных значений, а именно создание
константных структурных значений и введение структурных констант, да, в Оберонах это невозможно.
Если мы хотим, чтобы значения структурных объектов проверялись на фиксированность (постоянство) компилятором или хотя бы при загрузке, мы должны сделать идентификаторы этих объектов константами. А выражения для структурных значений этих констант должны использовать конструкторы структурных значений или предопределенные функции со структурными значениями.
Язык здесь требует расширения - конструкторами или преобразующими предопределенными функциями.
В варианте с преобразующими функциями, компактнее всего использовать строки.
Кстати. в Обероне вроде как нельзя переменные экспортировать не в read-only.
Я работаю только с КП в ББ, там можно.