
- •3 Этапы разработки
- •Алфавит языка
- •1.4 Выражения
- •1.4.1. Операнды
- •1.4.2. Предопределенные знаки операций
- •1.4.2.1. Логические операции
- •1.4.2.2 Арифметические операции
- •1.4.2.3. Знаки операций для множеств
- •1.4.2.4. Отношения
- •1.4.3. Определенные пользователем знаки операций и объявления знаков операций
- •1.4.3.1. Базисные знаки операций, для которых допустима перегрузка
- •1.4.3.2. Объявления новых знаков операций
- •1.4.3.3. Правила, управляющие перегрузкой
- •1.4.3.4. Старшинство операций
- •1.4.3.5. Численные разрешения внутри выражений
- •7. Операторы ввода-вывода
- •Условный оператор
- •Оператор цикла с предусловием в Паскале
- •Оператор цикла с постусловием в языке Паскаль
- •Оператор цикла с параметром в языке Паскаль
- •10 Одномерные и двумерные массивы
- •11 Пузырьковая сортировка (bubble sort)
- •Сортировка выборочная (selection sort)
- •Быстрая сортировка (quick sort)
- •Алгоритм поиска путей в лабиринте из песочницы
- •Предыстория
- •История
- •Анализ алгоритмов и программ, 2 семестр. Рекуррентность и рекурсия
- •Основы систем счисления из песочницы
- •Введение
- •Непозиционные системы
- •Единичная система счисления
- •Древнеегипетская десятичная система
- •Вавилонская шестидесятеричная система
- •Римская система
- •Позиционные системы счисления
- •Десятичная система счисления
- •Двоичная система счисления
- •Восьмеричная система счисления
- •Шестнадцатеричная система счисления
- •Однородные позиционные системы счисления
- •Смешанные системы счисления
- •Перевод из одной системы счисления в другую
- •Преобразование в десятичную систему счисления
- •Преобразование из десятичной системы счисления в другие
- •Преобразование из двоичной в восьмеричную и шестнадцатеричную системы
- •Преобразование из восьмеричной и шестнадцатеричной систем в двоичную
- •Преобразование дробной части двоичной системы в 8- и 16-ую
- •Преобразование дробной части десятичной системы в любую другую
1.4.3.1. Базисные знаки операций, для которых допустима перегрузка
Множество предопределенных операций, для которых допустимы перегрузки, является следующим:
- (унарный минус) + (унарный плюс) ~ ^ (унарное разыменование) + - * / div mod & or = # < <= > >= in := (присваивание является специальным случаем, см. 1.4.3.4)
Заметим, что для знаков операций implements и is не допустима перегрузка (См. 1.9.1).
1.4.3.2. Объявления новых знаков операций
Перегруженные операции вводятся как объявления знаков операций. Синтаксис объявления имеет следующий вид:
OperatorDeclaration = operator [ OpModifiers ] OpSymbol [ FormalParameters ] ";" OperatorBody ";". OperatorBody = Declarations BlockStatement OpSymbol. OpModifiers = "{" ident { "," ident } [ "," Priority ] "}". Priority = ConstExpression. OpSymbol = String. // 1-, 2- или 3-литерная строка; множество возможных символов ограничено
Пример:
operator '+' (x1, x2: Complex): Complex; var res: Complex; begin res.re := x1.re + x2.re; res.im := x1.im + x2.im; return res end '+';
Для перегруженных знаков операций количество параметров в объявлении знака операции должно быть тем же, что и для предопределенной операции с тем же знаком. Для объявления нового знака операций количество параметров в объявлении знака операции должно быть равным одному или двум в зависимости от того, является ли операция унарной или бинарной.
В определенном пользователем знаке операции для присваивания должно быть два параметра, первый из которых должен подставляться по ссылке.
Имеется возможность определять перегрузки и новые операции только в module, но не в object или definition. Причина – должна быть полная возможность статического разрешения перегрузки во время компиляции. Другая причина – ясно разделить две концепции: объекты, реализующие интерфейсы (определения) и абстрактные типы данных с ассоциированными операциями.
Объявления знаков операций можно сделать видимыми извне модуля, где они объявлены. В этом случае, законно использовать указанные знаки операций в нормальных выражениях наряду с предопределенными знаками операций в единицах, импортирующих данный модуль. Компилятор ответственен за выбор правильной версии знака операций в каждом случае.
Допускается определять знаки операций в некотором модуле для расширения абстрактного типа данных. Эти знаки операций должны быть определены в терминах операций, уже определенных в модуле, где объявлен абстрактный тип данных.
Обычно, все импортируемые вхождения должны квалифицироваться именами импортируемых единиц. Это также возможно, но не требуется для знаков операций. Например, имеется два законных способа использования “новых сложений” для операндов некоторого типа T.
module M; type T {public}= …; operator {public}"+" ( a, b : T ) : T; begin …end "+"; end M.
object Obj; import M; var x, y : T; begin x := x + y; (* подобно обычному выражению *) x := x M."+" y; (* полностью квалифицрованный *) end Obj.
Процедура знака операции не может быть вызвана как обычная функция:
x := M."+"(x, y); (* не законно; должна использоваться нотация выражения *)