Наука — Школе |
<Из документации к системе BlackBox, приложение В;
см. также Сообщение ...
Можно надеяться, что в будущем здесь появятся ссылки на пояснения и
примеры...>
• Типы-диапазоны
Используйте один из стандартных целых типов.
• Перечислительные типы
Используйте вместо них целые константы.
• Произвольные диапазоны для массивов
Массивы теперь всегда определены над целым диапазоном 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" 'Вывести "общий привет" на экран'
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
• Модули
Модули суть единицы компиляции, упрятывания информации, а также загрузки. Упрятывание информации — одна из главных черт объектно-ориентированного программирования. Возможны разные уровни упрятывания информации: полное упрятывание, экспорт только для чтения/реализации, полный экспорт.
См. детали в сообщении о языке.
• Расширенное переопределение типов
Типы записей (указательные типы) могут переопределяться, обеспечивая таким образом полиморфизм. Полиморфизм — одно из главных средств объектно-ориентированного программирования.
• Методы
Процедуры могут быть связаны с типами записей (указательными типами), таким образом обеспечивая позднее связывание. Позднее связывание является одним из главных средств объектно-ориентированного программирования. Такие процедуры еще называются методами.
• Операция с цепочками
Литерная цепочка, содержащаяся в литерном массиве, может быть выбрана посредством селектора $.
• Атрибуты записей
По умолчанию записи не могут быть переопределены (are non-extensible), но могут помечены как EXTENSIBLE, ABSTRACT или LIMITED.
• Атрибуты методов
Методы не могут быть переопределены по умолчанию, но могут быть помечены как EXTENSIBLE, ABSTRACT или EMTPY. Вновь вводимые методы должны быть помечены как NEW.
Наука — Школе |