© Английский оригинал: Oberon microsystems, 1994-2001.
© Перевод на русский язык: Ф.В.Ткачев, апрель 2001.
Используйте один из стандартных целых типов.
Используйте вместо них целые константы.
Массивы теперь всегда определены над целым диапазоном 0..max-1.
A = ARRAY 16 OF INTEGER (* разрешены индексы из диапазона 0..15 *)
Тип SET теперь означает набор целых чисел, который может включать элементы 0..31.
Неиспользуемая более память автоматически собирается сборщиком мусора. Вместо DISPOSE, просто присвойте переменной значение NIL.
Используйте (расширенное) переопределение записей.
Используйте типы SHORTCHAR или BYTE для значений, умещающихся в байт.
Используйте DEC и INC для целых значений.
Нет файловых типов. Ввод/вывод обеспечивается библиотечными процедурами.
3.0E+4, но не 3.0e+4
P = POINTER TO R
вместо
P = ^R
«|» вместо «;» в качестве разделителя случаев. Предложение 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) *)
BEGIN может появляться только перед последовательностью операторов, но не внутри ее. IF, WHILE, и LOOP всегда заканчиваются ключевым словом END.
Оператор WITH является локальной охраной типа, он не подразумевает наличие скрытой переменной и не открывает новый диапазон видимости для переменных.
См. детали в описании языка.
Операторы 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
Циклы 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.
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
.
Имеется новый оператор цикла с явным операторов выхода. См. детали в сообщении о языке.
Литертные массивы могут сравниваться с помощью операций =, #, <, >, ⇐ и >=.
Можно определять массивы, не указывая их размера, возможно, с несколькими измерениями.
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.