====== Приложение B: Отличия Компонентного Паскаля от Паскаля ======
(c) Английский оригинал: Oberon microsystems, 1994-2001.\\
(c) Перевод на русский язык: Ф.В.Ткачев, апрель 2001.
===== Исключенные средства =====
=== Типы-диапазоны ===
Используйте один из стандартных целых типов.
=== Перечислительные типы ===
Используйте вместо них целые константы.
=== Произвольные диапазоны для массивов ===
Массивы теперь всегда определены над целым диапазоном 0..max-1.
== Пример ==
A = ARRAY 16 OF INTEGER (* разрешены индексы из диапазона 0..15 *)
=== Нет общих множеств ===
Тип SET теперь означает набор целых чисел, который может включать элементы 0..31.
=== Нет явного оператора DISPOSE ===
Неиспользуемая более память автоматически собирается сборщиком мусора. Вместо DISPOSE, просто присвойте переменной значение NIL.
=== Нет вариантных записей ===
Используйте (расширенное) переопределение записей.
=== Нет упакованных структур ===
Используйте типы SHORTCHAR или BYTE для значений, умещающихся в байт.
=== Нет GOTO ===
=== Нет стандартных функций PRED и SUCC ===
Используйте DEC и INC для целых значений.
=== Нет встроенных средств ввода/вывода ===
Нет файловых типов. Ввод/вывод обеспечивается библиотечными процедурами.
===== Измененные средства =====
=== Стандартная процедура ENTIER вместо ROUND ===
=== Синтаксис для констант типа REAL ===
3.0E+4, но не 3.0e+4
=== Синтаксис для объявлений указательных типов ===
P = POINTER TO R
вместо
P = ^R
=== Синтаксис для оператора CASE ===
"|" вместо ";" в качестве разделителя случаев.
Предложение ELSE.
== Пример ==
CASE i * 3 - 1 OF
0: StdLog.String("нуль")
| 1..9: StdLog.String("от единицы до девяти")
| 10, 20: StdLog.String("десять или двадцать")
ELSE StdLog.String("что-то еще")
END
=== Имя процедуры должно быть повторено ===
== Пример ==
PROCEDURE DrawDot (x, y: INTEGER);
BEGIN
END DrawDot;
=== Большие и малые буквы различаются ===
== Пример ==
"proc" не то же самое, что "Proc".
=== Синтаксис литерных цепочек ===
Литерные цепочки-константы заключаются между " или между '. В одной цепочке не может быть одновременно одиночных и двойных кавычек. Литерные цепочки-константы единичной длины могут присваиваться литерным (character) переменным.
== Пример ==
"That's great" 'Write "hello world" to the screen'
ch := "x"
ch := 'x'
=== Комментарии ===
Комментарии заключаются между (* и *) и могут быть вложены.
=== Скобки для множеств ===
Константы-множества задаются между { и } вместо [ и ].
== Пример ==
{0..2, 4, j..2 * k}
=== Синтаксис функций ===
Используйте ключевое слово PROCEDURE также и для функций вместо FUNCTION.\\
Процедуры, возвращающие значение, всегда должны иметь (возможно пустой) список параметров в своих объявлениях и в вызовах.\\
Результат функции возвращается явно оператором RETURN, вместо присваивания имени функции.
== Пример ==
PROCEDURE Fun (): INTEGER;
BEGIN
RETURN 5
END Fun;
вместо
FUNCTION Fun: INTEGER;
BEGIN
Fun := 5
END;
n := Fun()
вместо
n := Fun
=== Объявления ===
Последовательность объявлений теперь
{ ConstDecl | TypeDecl | VarDecl} {ProcDecl | ForwardDecl}
вместо
[ConstDecl] [TypeDecl] [VarDecl] {ProcDecl}.
Упреждающие (Forward) объявления необходимы, если процедура используется до ее определения.
== Пример ==
PROCEDURE ^ Proc;
вместо
PROCEDURE Proc; FORWARD;
=== Процедурные типы ===
Процедуры могут быть не только переданы в качестве параметров, но и присваиваться переменным процедурных типов.
== Пример ==
TYPE P = PROCEDURE (x, y: INTEGER);
VAR v: P;
v := DrawDot; (* присваивание *)
v(3, 5); (* вызов DrawDot(3, 5) *)
=== Явные END вместо составных операторов ===
BEGIN может появляться только перед последовательностью операторов, но не внутри ее. IF, WHILE, и LOOP всегда заканчиваются ключевым словом END.
=== Оператор WITH ===
Оператор WITH является локальной охраной типа, он не подразумевает наличие скрытой переменной и не открывает новый диапазон видимости для переменных.\\
См. детали в описании языка.
=== ELSIF ===
Операторы IF могут иметь несколько ветвей.
== Пример ==
IF name = "top" THEN
StdLog.Int(0)
ELSIF name = "bottom" THEN
StdLog.Int(1)
ELSIF name = " charm" THEN
StdLog.Int(2)
ELSIF name = "beauty" THEN
StdLog.Int(3)
ELSE
StdLog.String("strange")
END
=== BY вместо только DOWNTO в FOR ===
Циклы FOR могут использовать любое константное значение в качестве приращения (положительного или отрицательного).
== Пример ==
FOR i := 15 TO 0 BY -1 DO StdLog.Int(i, 0) END
=== Булевы выражения используют "сокращенное" вычисление ===
Вычисление булева выражения прекращается, как только его результат определен.
== Пример ==
Следующее выражение не вызывает ошибки при выполнении, когда p = NIL:
IF (p # NIL) & (p.name = "quark") THEN
=== Константные выражения ===
В объявлениях констант допустимы не только буквальные константы, но и константные выражения.
== Пример ==
CONST
zero = ORD("0");
one = zero + 1;
=== Разные операции ===
# используется вместо <> для проверки на неравенство.
& используется вместо AND для логической конъюнкции.
~ используется вместо NOT для логического отрицания.
=== Явное преобразование к меньшему типу с помощью SHORT ===
Включение типов для числовых типов позволяет присваивать значения меньшего типа переменной большего типа. Присваивание в обратном направлении должно использовать стандартную процедуру SHORT.
== Пример ==
int := shortint;
shortint := SHORT(int)
===== Новые средства =====
=== Шестнадцатеричные числа и литеры ===
== Пример ==
100H (* десятичное 256 *)
0DX (* возврат каретки *)
=== Дополнительные числовые типы ===
Добавлены типы LONGINT, SHORTINT, BYTE, SHORTREAL.
=== Симметрическая разность множеств ===
Множества могут вычитаться.
=== Новые стандартные процедуры ===
Добавлены новые стандартные процедуры ''INC, DEC, INCL, EXCL, SIZE, ASH, HALT, ASSERT, LEN, LSH, MAX, MIN, BITS, CAP, ENTIER, LONG'' и ''SHORT''.
=== LOOP с EXIT ===
Имеется новый оператор цикла с явным операторов выхода. См. детали в сообщении о языке.
=== ARRAY OF CHAR могут сравниваться ===
Литертные массивы могут сравниваться с помощью операций =, #, <, >, <= и >=.
=== Открытые массивы, многомерные массивы ===
Можно определять массивы, не указывая их размера, возможно, с несколькими измерениями.
== Пример ==
VAR a: POINTER TO ARRAY OF CHAR;
NEW(a, 16)
PROCEDURE ScalarProduct (a, b: ARRAY OF REAL; VAR c: ARRAY OF REAL);
TYPE Matrix = ARRAY OF ARRAY OF REAL;
PROCEDURE VectorProduct (a, b: ARRAY OF REAL; VAR c: Matrix);
=== Разыменование указателей не обязательно ===
Операция разыменования ^ может быть опущена.
== Пример ==
root.next.value := 5
вместо
root^.next^.value := 5
=== Модули ===
Модули суть единицы компиляции, упрятывания информации, а также загрузки. Упрятывание информации -- одна из главных черт объектно-ориентированного программирования. Возможны разные уровни упрятывания информации: полное упрятывание, экспорт только для чтения/реализации, полный экспорт.\\
См. детали в сообщении о языке.
=== Расширенное переопределение типов ===
Типы записей (указательные типы) могут переопределяться, обеспечивая таким образом полиморфизм. Полиморфизм -- одно из главных средств объектно-ориентированного программирования.
=== Методы ===
Процедуры могут быть связаны с типами записей (указательными типами), таким образом обеспечивая позднее связывание [late binding]. Позднее связывание является одним из главных средств объектно-ориентированного программирования. Такие процедуры еще называются методами.
=== Операция с цепочками ===
Литерная цепочка, содержащаяся в литерном массиве, может быть выбрана посредством селектора $.
=== Атрибуты записей ===
По умолчанию записи не могут быть переопределены, но могут быть помечены как EXTENSIBLE, ABSTRACT или LIMITED.
=== Атрибуты методов ===
Методы не могут быть переопределены по умолчанию, но могут быть помечены как EXTENSIBLE, ABSTRACT или EMTPY. Вновь вводимые методы должны быть помечены как NEW.