Полезные отличия Оберона от Паскаля
Первое, что радует в Обероне (после работы на Паскале), – это сокращённая форма записи составных операторов, а если проще, то было (Pascal):
Стало (Oberon):
Слово BEGIN мы пишем только в двух случаях:
a) В самом начале каждой процедуры после объявлений констант, типов и переменных. Таким образом, BEGIN отделяет друг от друга объявление новых сущностей (декларатив) и исполняемую часть (императив) внутри процедуры;
b) В секции инициализации модуля, после всех процедур, (перед END Module). Этот код инициализирует модуль неявным вызовом, чтобы подготовить его к работе. Своеобразный “конструктор” (в терминах ООП) модуля. В язык КП добавлены ещё и “деструкторы” – секция деинициализации модуля CLOSE.
Это очень удобно.
В связи с этим вопрос. Вы бы предпочли в модулях Basic и Laser неявную инициализацию? Т.е. чтобы не надо было писать B.Init и L.Init, ограничась B.Quit? Это возможно. Надо устроить опрос наверное. Кстати, имена процедур в модуле Basic обсуждаемы, давайте предложения. Ну и кое-что наверное здесь надо добавить, не все операторы ZX-Basic реализованы. Если напишете что-нить полезненькое, присылайте.
Второе полезное отличие от Паскаля – в Обероне появилась форма “вечного” цикла LOOP END.
Т.е. не нужно писать WHILE TRUE или UNTIL FALSE. Пишем LOOP END. Из цикла LOOP можно выйти по EXIT, также ессно можно выйти изнутри цикла LOOP по RETURN (возврат целиком из процедуры).
---------- Post added at 10:57 ---------- Previous post was at 10:34 ----------
В языках Си и Паскаль интерфейсные части (*.h и секция interface), скажем так, модулей формируются ручной работой, чреватой потерей времени на правки рассинхронизаций интерфейсной и реализующей части (особенно в Си). В Delphi объявления сущностей, видимых извне (экспортированных), в секциях interface и implementation дублируются. В Обероне все экспортируемые сущности помечаются звёздочкой * или минусом –. Минус обозначает экспорт только для чтения, что убирает риск нежелательного изменения переменной извне, например.
Код:
VAR
a, b, c: INTEGER; (* Это внутренние переменные модуля, извне не видны *)
d-, e-: INTEGER; (* Эти переменные доступны извне только для чтения *)
f*, g*, h*: INTEGER; (* А эти доступны извне как для чтения, так и для записи *)
Предлагаю убедиться как легко сгенерировать интерфейсную часть (а часто для пользования функционалом модуля это единственное, что нужно знать; все механизмы реализации скрыты от конечного пользователя интерфейсом – инкапсуляция). Откройте:
File -> Open -> ZXDev/Mod/Basic.odc
Нажмите F12 (скомпилируем наш модуль подсистемой Dev, таким образом создастся символьный файл – сгенерированный интерфейс экспортов модуля). Дважды щёлкните на слове Basic и нажмите Ctrl+D. Откроется что-то такое:
Код:
DEFINITION Basic;
CONST
Black = 0;
Blue = 1;
Brown = 6;
Cyan = 5;
Green = 4;
LightBlue = 1;
LightCyan = 5;
LightGray = 7;
LightGreen = 4;
LightMagenta = 3;
LightRed = 2;
Magenta = 3;
Off = 0;
On = 1;
Red = 2;
White = 7;
Yellow = 6;
PROCEDURE AT (y, x: Coords);
PROCEDURE ATTR (y, x: Coords): BYTE;
PROCEDURE BEEP (ms: CARDINAL; freq: INTEGER);
PROCEDURE BORDER (color: Color);
PROCEDURE BRIGHT (mode: Mode);
PROCEDURE CIRCLE (cx, cy, radius: Coords);
PROCEDURE CLS;
PROCEDURE DRAW (x, y: Coords);
PROCEDURE FLASH (mode: Mode);
PROCEDURE FONT (addr: ADDRESS);
PROCEDURE INK (color: Color);
PROCEDURE INVERSE (mode: Mode);
PROCEDURE Init;
PROCEDURE KeyPressed (): BOOLEAN;
PROCEDURE OVER (mode: Mode);
PROCEDURE PAPER (color: Color);
PROCEDURE PAUSE (ticks: CARDINAL);
PROCEDURE PEEK (addr: ADDRESS): BYTE;
PROCEDURE PLOT (x, y: Coords);
PROCEDURE POINT (x, y: Coords): BYTE;
PROCEDURE POKE (addr: ADDRESS; value: BYTE);
PROCEDURE PORTIN (port: ADDRESS): BYTE;
PROCEDURE PORTOUT (port: ADDRESS; value: BYTE);
PROCEDURE PRCHAR (ch: CHAR);
PROCEDURE PRINT (i: INTEGER);
PROCEDURE PRSTR (str: ARRAY OF CHAR);
PROCEDURE PRWORD (i: CARDINAL);
PROCEDURE Quit;
PROCEDURE RANDOMIZE (seed: CARDINAL);
PROCEDURE RND (min, max: CARDINAL): CARDINAL;
PROCEDURE SGN (x: INTEGER): INTEGER;
PROCEDURE SlowCircle (cx, cy, radius: Coords);
END Basic.
---------- Post added at 11:24 ---------- Previous post was at 10:57 ----------
Точно также поступаем и с Laser. Так можно и параметры процедур быстро посмотреть, и типы, и константы с переменными. Всё ж не упомнишь.
Код:
DEFINITION Laser;
PROCEDURE ASLV (col, row, len, hgt: BYTE);
PROCEDURE ASRV (col, row, len, hgt: BYTE);
PROCEDURE ATDV (col, row, len, hgt: BYTE);
PROCEDURE ATOF;
PROCEDURE ATON;
PROCEDURE ATUV (col, row, len, hgt: BYTE);
PROCEDURE AWLV (col, row, len, hgt: BYTE);
PROCEDURE AWRV (col, row, len, hgt: BYTE);
PROCEDURE CLSM (spN: BYTE);
PROCEDURE CLSV (col, row, len, hgt: BYTE);
PROCEDURE GMAT (col, row, spD, spS: BYTE);
PROCEDURE GMBL (col, row, spD, spS: BYTE);
PROCEDURE GMND (col, row, spD, spS: BYTE);
PROCEDURE GMOR (col, row, spD, spS: BYTE);
PROCEDURE GMXR (col, row, spD, spS: BYTE);
PROCEDURE GTBL (col, row, spN: BYTE);
PROCEDURE GTND (col, row, spN: BYTE);
PROCEDURE GTOR (col, row, spN: BYTE);
PROCEDURE GTXR (col, row, spN: BYTE);
PROCEDURE INVM (spN: BYTE);
PROCEDURE INVV (col, row, len, hgt: BYTE);
PROCEDURE Init;
PROCEDURE MARV (col, row, len, hgt: BYTE);
PROCEDURE MIRV (col, row, len, hgt: BYTE);
PROCEDURE PMAT (col, row, spD, spS: BYTE);
PROCEDURE PMBL (col, row, spD, spS: BYTE);
PROCEDURE PMND (col, row, spD, spS: BYTE);
PROCEDURE PMOR (col, row, spD, spS: BYTE);
PROCEDURE PMXR (col, row, spD, spS: BYTE);
PROCEDURE PTBL (col, row, spN: BYTE);
PROCEDURE PTND (col, row, spN: BYTE);
PROCEDURE PTOR (col, row, spN: BYTE);
PROCEDURE PTXR (col, row, spN: BYTE);
PROCEDURE PWBL (col, row, spN, spCol, spRow, len, hgt: BYTE);
PROCEDURE PWND (col, row, spN, spCol, spRow, len, hgt: BYTE);
PROCEDURE PWOR (col, row, spN, spCol, spRow, len, hgt: BYTE);
PROCEDURE PWXR (col, row, spN, spCol, spRow, len, hgt: BYTE);
PROCEDURE SCRM (spN, npx: BYTE);
PROCEDURE SCRV (col, row, len, hgt, npx: BYTE);
PROCEDURE SETV (col, row, len, hgt: BYTE);
PROCEDURE SL1M (spN: BYTE);
PROCEDURE SL1V (col, row, len, hgt: BYTE);
PROCEDURE SL4M (spN: BYTE);
PROCEDURE SL4V (col, row, len, hgt: BYTE);
PROCEDURE SL8M (spN: BYTE);
PROCEDURE SL8V (col, row, len, hgt: BYTE);
PROCEDURE SR1M (spN: BYTE);
PROCEDURE SR1V (col, row, len, hgt: BYTE);
PROCEDURE SR4M (spN: BYTE);
PROCEDURE SR4V (col, row, len, hgt: BYTE);
PROCEDURE SR8M (spN: BYTE);
PROCEDURE SR8V (col, row, len, hgt: BYTE);
PROCEDURE WCRM (spN, npx: BYTE);
PROCEDURE WCRV (col, row, len, hgt, npx: BYTE);
PROCEDURE WL1M (spN: BYTE);
PROCEDURE WL1V (col, row, len, hgt: BYTE);
PROCEDURE WL4M (spN: BYTE);
PROCEDURE WL4V (col, row, len, hgt: BYTE);
PROCEDURE WL8M (spN: BYTE);
PROCEDURE WL8V (col, row, len, hgt: BYTE);
PROCEDURE WR1M (spN: BYTE);
PROCEDURE WR1V (col, row, len, hgt: BYTE);
PROCEDURE WR4M (spN: BYTE);
PROCEDURE WR4V (col, row, len, hgt: BYTE);
PROCEDURE WR8M (spN: BYTE);
PROCEDURE WR8V (col, row, len, hgt: BYTE);
END Laser.