Saferoll писал(а):
Т.е. всякие SYSTEM.SHORTCARD - это просто пометки имеющихся знаковых типов, учитываемые только при трансляции в Си (signed или unsigned)?
В текущей реализации — да, действительно всё обстоит именно так.
Saferoll писал(а):
А до трансляции всё так знаковое и есть и разницы между SHORTCARD и SYSTEM.BYTE нету?
Разница есть. Попробуй откомпилировать цикл со счётчиком типа SYSTEM.BYTE. Как я понимаю, тип BYTE в Обероне вообще не предназначен для арифметических операций, а служит для системных нужд, а также в качестве прослойки для совместимости несистемных типов (например, ARRAY OF SYSTEM.BYTE ложится на ARRAY OF CHAR).
Saferoll писал(а):
А нельзя сделать, чтобы Platform.Unsigned (константное выражение) тоже считалось константным выражением?
Это сделать очень непросто, т.к. модуль Platform является для Офронта равнозначным с другими модулями, да и идеологически наверное всё-таки плохо. Гораздо проще сделать SYSTEM.Unsigned, но надо продумать его семантику. Разрешить ему преобразовывать насильно отрицательные значения в положительное, как машине на голову вздумается (или как повсеместно принято), или же по-обероновски контролировать приведение типов на выход за пределы значений. Мне кажется, Platform.Unsigned должен потерять свой смысл когда будут нормально реализованы беззнаковые типы (чтобы контроль присваивания, MAX и MIN учитывали беззнаковость). Я придумал ещё случай, где не сработает Platfrom.Unsigned — это метка CASE.
Saferoll писал(а):
У FOR диапазон возможных значений для шага должен быть совсем другим, не как сейчас "Step имеет такой же тип, как и переменная n". Иначе мы не сможем написать FOR n:=255 TO 0 BY -1, ведь (-1) вне диапазона 0..255!
Ты прав, этот случай обязательно надо учесть.
Согласен, я реализовываю беззнаковые не научно, без тщательной продумки, а как придётся, но на самом деле невесело было делать это только для себя самого. Теперь хоть интереса побольше.
А путь доработки Офронта, возможно, не так прост, как я думаю. Автор Офронта Josef Templ высказался о введении в его детище беззнаковых типов так:
Josef Templ писал(а):
As far as I know, there is no simple way to support new types without significantly extending the compiler incl. the symbol file format and the code generator. This may get messy.
What you can do is use native code procedures for calling special functions (expressed as macros in Ofront) on such types by casting to unsigned types but defining the parameters as signed types.