Вообще, если уж улучшать систему типов оберона, добавляя в неё дженерики, то надо бы избавиться и от таких рудиментов как
TYPE PList = POINTER TO List;
List = RECORD
elem: SomeType;
next: PList
END;
Во всех современных языках делается так:
TYPE List = RECORD
elem: SomeType;
next: POINTER TO List
END;
Кроме того, предложенный Шиперским вариант обозначения дженериков различается у типов и процедур, это неконсистентный дизайн, имхо.
<A> пошло от всяких сишарпов и с++, на треугольные скобки накладывается лишний функционал, а, например, фигурные скобки вообще не используются.
И, кстати, в обероне-07 вроде нет процедур, привязанных к записям, как в обероне-2?
Короче, пример из первого сообщения может выглядеть как-то так:
TYPE Proc{A} = PROCEDURE (x: A);
TYPE Collection{A} = RECORD
elem: A
END;
List{A} = RECORD (Collection{A})
next: POINTER TO List{A}
END;
Tree{A} = RECORD (Collection{A})
left, right: POINTER TO Tree{A}
END;
PROCEDURE Map{A} (c: Collection{A}; p: Proc{A});
BEGIN p(c.elem)
END Map;
PROCEDURE Map{A} (l: List{A}; p: Proc{A});
BEGIN
Map{A}(l, p); (* "super call" to overridden procedure *)
IF l.next # NIL THEN Map{A}(l.next, p) END
END Map;
PROCEDURE Map{A} (t: Tree{A}; p: Proc{A});
BEGIN
IF t.left # NIL THEN Map{A}(t.left, p) END;
Map{A}(l, p);
IF t.right # NIL THEN Map{A}(t.right, p) END
END Map;
Правда, тут получилась перегрузка имён процедур, а как известно всем образованным программистам, лучший способ пергрузочного полиформизма -- это классы типов ))
ЗЫ. С другой стороны, фигурные скобки можно было бы отвести под инициализаторы массивов и записей. Нагружать этой функцией круглые или прямоугольные тоже не очень.
ЗЗы. С третьей стороны, круглые скобки можно считать инициализатором процедуры -- список параметров, так что и для роли инициализатора массива или записи тоже вроде годится...
PPPS. А если ещё и ключевые слова в нижнем регистре, да ещё и light-syntax (значимые отступы)... Короче, это уже нельзя будет назвать Обероном. В лучшем случае какой-нить Титанией )))