Автор Тема: Oberon-07M - Нужен ли препроцессор?  (Прочитано 18710 раз)

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #15 : Март 29, 2011, 05:21:16 pm »
Да нет, это вообще может быть применимо к любым текстовым документам.

Я бы даже сказал, что это технология ближе к репозиторной - версионирования.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #16 : Март 29, 2011, 05:46:27 pm »
Да нет, это вообще может быть применимо к любым текстовым документам.

Я бы даже сказал, что это технология ближе к репозиторной - версионирования.
Значит похоже на макросы какие-то :-) (не обязательно сишные)
Впрочем, в общем то шаблоны плюсов это и есть макросы (не в сишном понимании этого слова конечно же).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M - Нужен ли препроцессор?
« Ответ #18 : Апрель 06, 2011, 02:48:36 pm »
Нашел решение, которое меня устраивает. Решение дешевое и сердитое :)

Решил не делать внешний препроцессор, так как потребуется реализовывать свой парсер, обработку выражений и т.д. Зачем? Если все это уже есть в языке Oberon-07. Можно написать программу, которая будет генерировать модуль WinApi для различных параметров. Программа выглядит примерно так:
MODULE WinApiPre;

  IMPORT Out, p := PreProc;

  PROCEDURE Do*;
  BEGIN
    Out.WriteLn('MODULE WinApi;');
    Out.WriteLn('');
    Out.WriteLn('  CONST');
    ...
    Out.WriteLn('    WM_RBUTTONUP* = 0205H;');
    Out.WriteLn('    WM_RBUTTONDBLCLK* = 0206H;');
    Out.WriteLn('    WM_MBUTTONDOWN* = 0207H;');
    Out.WriteLn('    WM_MBUTTONUP* = 0208H;');
    Out.WriteLn('    WM_MBUTTONDBLCLK* = 0209H;');
    IF p.IntGeq(p.Find("_WIN32_WINNT"), 0400H) OR p.IntGeq(p.Find("_WIN32_WINDOWS"), 0400H) THEN
      Out.WriteLn('    WM_MOUSEWHEEL* = 020AH;');
    END;
    IF p.IntGeq(p.Find("_WIN32_WINNT"), 0500H) THEN
      Out.WriteLn('    WM_XBUTTONDOWN* = 020BH;');
      Out.WriteLn('    WM_XBUTTONUP* = 020CH;');
      Out.WriteLn('    WM_XBUTTONDBLCLK* = 020DH;');
    END;
    IF p.IntGeq(p.Find("_WIN32_WINNT"), 0600H) THEN
      Out.WriteLn('    WM_MOUSEHWHEEL* = 020EH;');
    END;
    IF p.IntGeq(p.Find("_WIN32_WINNT"), 0600H) THEN
      Out.WriteLn('    WM_MOUSELAST* = 020EH;');
    ELSIF p.IntGeq(p.Find("_WIN32_WINNT"), 0500H) THEN
      Out.WriteLn('    WM_MOUSELAST* = 020DH;');
    ELSIF p.IntGeq(p.Find("_WIN32_WINNT"), 0400H) OR p.IntGeq(p.Find("_WIN32_WINDOWS"), 0400H) THEN
      Out.WriteLn('    WM_MOUSELAST* = 020AH;');
    ELSE
      Out.WriteLn('    WM_MOUSELAST* = 0209H;');
    END;
    Out.WriteLn('    WM_PARENTNOTIFY* = 0210H;');
    Out.WriteLn('    WM_ENTERMENULOOP* = 0211H;');
    Out.WriteLn('    WM_EXITMENULOOP* = 0212H;');
    ...
    Out.WriteLn('');
    Out.WriteLn('END WinApi.');
  END Do;

END WinApiPre.
Параметры также задаются в модуле написанном на Oberon-07, внешний файл параметров не стал делать, так как потребуется его парсить.

Думаю, что гененировать модуль WinApi потребуется не очень часто, например, раз в пол года, и это решение вполне подходит для этого. При этом не потребуется создавать WinApi модуль с нуля для других определенных параметров, а просто изменить параметр внутри программы, перекомпилировать программу и запустить полученную программу, которая сгенерирует выходной файл с константами.

Да, я видел такие решения на си и с++. Эдакий бутстрап. Для маленьких конкретных задачек вполне вариант. Но, к сожалению, в общем случае это не отменяет надобности в обсуждаемом тут механизме.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"