Сейчас занимаюсь вот чем. На повестке дня пару вопросов, а поскольку посоветоваться почти не с кем, пишу сюда своеобразные “дневниковые” записки.
1. Определение главного модуля.
В Оберон-системах этот вопрос вообще неактуален. Но мы, поскольку XDev планируется для кроссплатформенной (и отчуждаемой от среды) разработки, приходим к вопросу: с какого же модуля начать исполнение программы?
Сейчас в XDev можно воспользоваться средством, которое предоставляет Ofront-подсистема:
Ofront -> Tool -> generate main program
Если эта галочка установлена, то для кода инициализации текущего модуля (BEGIN) генерируется исходник на Си со входом — функцией main. До сих пор этой возможности мне хватало, но надо решить этот вопрос кардинально, ведь это неправильно, когда в процессе доработки сразу несколько модулей приходится то снимать, то устанавливать галочку.
Желание как-то автоматизировать этот процесс наталкивает на следующие пути решения:
a) по нажатию F11 (компиляция) среда автоматически сбрасывает галочку “главный модуль”, по F12 (сборка) — автоматически устанавливает. Привожу этот пункт только для полноты картины, ибо здесь есть прокол: если дорабатывается не главный модуль, то перед сборкой (нажатием F12) надо будет активизировать документ с главным модулем, иначе среда посчитает главным активный модуль.
b) Задавать главный модуль где-то в отдельном файле конфигурации проекта. (Где можно сохранить ещё, если не файле конфигурации?)
c) Задавать его в меню XDev -> Установить главный модуль (как это сделано в IDE Oberon-07/11 от akron). Здесь есть минус — знание о главном модуле будет теряться, если его опять же где-то не сохранить. И мы возвращаемся к пункту b.
d) Трудное решение, и понравится не всем, однако я склоняюсь именно к нему. Ввести на уровне исходника директиву (* $Main *) или (* $SET Main *) (замаскированную для совместимости с другими реализациями под комментарий), которая однозначно даст Ofront’у указку, что данный модуль — главный. Попутно с этим можно (даже желательно) ввести подобные же директивы для других опций Ofront’а.
Код: "OBERON"
MODULE XDevHello; (* $Main *)
IMPORT C := Console;
BEGIN
C.SetColors(C.CyanOnBlue);
C.WriteStr("Hello Cross-platform World");
END XDevHello.
Всем хорош и прекрасен для меня именно пункт d, хотя он же и наиболее трудоёмок в реализации. Из минусов предвосхищаю упрёки в “возвращении к Турбо Паскалю” и его директивам, задаваемым таким способом. Однако если вам есть что сказать по данному вопросу, милости прошу.