====== Приложение 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.