я не очень понял, когда эта тема превратилась в бложег «дизайним очередной оберон», ну да пусть. всё-таки Ультра Паскаль так ломать нельзя — а очень хочется.
вот он я сижу на распутье, щеку рукой подперев, бороду поглаживая. думу мрачную думаю: делать ли enum-ы, или нет?
автонумерацию констант надо делать однозначно: это ничему не вредит. а вот полноценный тип enum…
с одной стороны — это хорошо: ежели мы на вход, значится, просим тип `Action`, и он описан как `Action = INTEGER`, то и залезет к такой девице любой интегер без стыда. а вот ежели это какой-нибудь `Action = ENUMERABLE … END`, то и надо будет явно цела молодца величать: `Action.Meow`. а из других семей молодцев и на порог не пустят. однако ж что ежели надо будет нам добавить `Action.Woof`, да в другом доме? а потом `Action.Bark`, да в третьем, но получив `Action` из нулевого оригинального?
короче, расширение енумов — ненужный геморрой. а без него полезность значительно снижается.
есть, впрочем, ещё один вариант: «enum-ы без значений». для этих целей можно использовать записи без полей, и разрешить такие записи создавать инлайном. короче, что-то типа:
Код:
TYPE
BaseAction = EXTENSIBLE EMPTY RECORD;
Action1 = EMPTY RECORD (BaseAction);
Action2 = EMPTY RECORD (BaseAction);
PROCEDURE DoIt (act: BaseAction);
тут обычный WITH, делов-то.
и вызов:
DoIt(Action1);
запись явно помечена как `EMPTY`, и поэтому можно тупо использовать имя типа как «конструктор». всё равно передаётся в итоге только typeid.
это элегантно решает все проблемы со значениями enum-ов (которые всё равно обычно нужны только затем, чтобы быть уникальными), но вводит в язык неочевидный хак. с другой стороны — хак мне нравится.
прошу отклик зала: это очень уродливо и бесполезно по вашему мнению, или вполне может жить?
p.s.: на самом деле такой хак и в Ультра Паскаль можно затащить, он там ничего не сломает. правда, CP2 очень герметичный компилятор в самом плохом смысле слова, и активно сопротивляется любым изменениям за счёт адовой обфускации кода. но где наша не побеждала…