Торжественно сообщаю, что Ofront+ опять перешёл в статус "все критичные проблемы исправлены". На сей раз серьёзно поправлена
обработка определений циклических типов, которая потребовала немало времени, чтобы с этим разобраться.
Дмитрий Викторович, мы с Вами называли такие определения рекурсивными, но по терминологии разработчиков ETH Oberon и BlackBox они называются циклическими. А рекурсивными называются определения вида:
Код:
TYPE Typ = Typ; (* error 58: recursive type definition *)
Получается, что рекурсивные определения типов не имеют смысла, а циклические согласно описания языка Компонентный Паскаль допустимы:
Цитата:
A declaration of a type T containing references to another type T1 may occur at a point where
T1 is still unknown. The declaration of T1 must follow in the same block to which T is local.
Здесь прямо не говорится о циклических определениях, но они и не запрещены.
В связи с чем я изменил константу OPC.RecursiveType на CyclicType.
Итак, сейчас Ofront+ успешно транслирует все примеры, о которых были посты выше, плюс даже такой:
Код:
MODULE Ex111;
TYPE
Proc = PROCEDURE (b: Proc);
VAR p: Proc;
PROCEDURE Abc (b: Proc); END Abc;
BEGIN
p := Abc
END Ex111.
А вот если результатом процедуры типа Proc будет Proc, то на таком коде Ofront+ просто выдаст ошибку "not yet implemented":
Код:
TYPE
Proc = PROCEDURE (): Proc;
Вопрос дискуссионный, но я не знаю как это транслировать в Си. Мы обсудили это
в группе по Ofront+ в Telegram и единодушно решили, что польза от этих циклических определений весьма сомнительна.
Да, циклические определения разрешены в Ofront+ только для Компонентного Паскаля.
P.S. Могу посодействовать исправлению этих моментов в МультиОбероне. Напрямую брать моё решение в лоб вряд ли нужно — в Ofront+ работа с массивами устроена несколько иначе, чем в CPfront. Но пока в моей голове свежи все эти моменты, можем заняться, если конечно есть интерес.