
- •6.1.2.2. Присваивание ссылок на объект
- •7. Дистанционное обращение
- •7.1. Дистанционные идентификаторы
- •7.2. Присоединения
- •9.2. Квазипараллельное исполнение
- •Integer procedure pos;
- •Inspect sysout do inspect sys in do
- •11.4.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.3.2. Семантика
- •14.2.4. Управляющие процедуры
6. ОПЕРАТОРЫ
6.1. ОПЕРАТОРЫ ПРИСВАИВАНИЯ
Знак операции := (читается — становится равным) означает:— присваивание некоторого значения переменной обык- - новенного типа или идентификатору процедуры обыкновенного типа, являющемуся ЛЧ значений, или
—. присваивание текстового значения тексту, на который ссылается ЛЧ значений.
Знак операции : — (читается — начинает обозначать) означает: — присваивание " ссылки переменной ссылочного типа или идентификатору процедуры ссылочного типа, являющемуся ЛЧ ссылок.
В этом контексте идентификатор процедуры означает участок памяти (ячейку), локальный в соответствующем экземпляре процедуры. Содержимое этого участка и является значением или ссылкой, доставляемой соответствующим указателем функции при его вычислении.
Присваиваемое значение (или ссылка) является копией значения (или ссылки), получающегося при вычислении ПЧ значений (или ссылок). Если ПЧ сама есть присваивание, то
доставляемое ею значение является копией значения, присвоенного при ее выполнении в качестве присваивания.
Любое выражение, которое является ЛЧ или его составной частью, вычисляется раньше вычисления ПЧ. Подробное описание присваивания текстовых значений см. в разд. 10.6.
Для объектов не существует присваивания значений.
Тип значения или ссылки, получающейся при вычислении ПЧ, должен совпадать с типом ЛЧ. Из этого правила допускаются исключения, рассматриваемые ниже. .. • "
Если ЛЧ является формальным параметром, а тип соответствующего фактического параметра не совпадает с типом формально^ спецификации, то операция присваивания выполняется в два этапа:
1) выполняется присваивание значения ПЧ некоторой фиктивной переменной типа, специфицированного для формального параметра;
* 2) выполняется присваивание, ЛЧ которого является фактический параметр, а ПЧ — упомянутая фиктивная переменная.
Значением (или ссылкой), получающимся при вычислении присваивания, является в этом случае содержимое упомянутой фиктивной переменной.
Относительно присваивания ссылок на текст см. разд. 10.5.
6.1.2.1. Присваивание арифметических значений
Так же как и в языке АЛГОЛ-60, любое арифметическое значение может быть присвоено ЛЧ типа real или integer. При необходимости выполняется соответствующая функция преобразования. '
В качестве примера рассмотрим оператор (не допустимый, однако, в языке АЛГОЛ-60)
где X и Y суть переменные типа real, i—переменная типа integer, a F — формальный параметр, вызываемый по найме-' нованию и специфицированный как real. Если фактическим-параметром, соответствующим F, является переменная типа real, то X, /, У и F получают значения 3, 3, 3.14 и 3.14 соот-'. ветственно. Если же фактическим параметром, соответствующим F, является переменная типа integer, то X, £, У и F получают значения 3, 3, 3.14 и 3 соответственно.
6.1.2.2. Присваивание ссылок на объект
Пусть ЛЧ присваивания ссылок на объект квалифицирована идентификатором класса С/, и пусть ПЧ квалифициро вана идентификатором класса Сг. Если ПЧ сама является присваиванием ссылок, то Сг по определению является квали фикацией ЛЧ этого последнего присваивания. Пусть V есть значение, получающееся при вычислении ПЧ. Законность и результат присваивания ссылок зависят от соотношения между С/, Сг и V. L
Случай 1. Класс С1 содержит класс Сг. Присваиваниессылок законно, и операция присваивания выполняется.
Случай 2. Класс С1 является подклассом класса Сг. Присваивание законно. Оно выполняется, если V есть попе, или является объектом класса С1/, или подкласса класса С1. В противном случае выдается сообщение об ошибке.
Случай 3. С1 и Сг не удовлетворяют ни одному из указанных выше условий. Присваивание незаконно.
Аналогичные правила приложимы также к неявным присваиваниям параметру цикла и к передаче параметров.
' Пример 1:
Пусть Гаусс есть класс, декларированный в примере в разд. 2.2.
ref (Гаусс) *G5, G10;
G5: —new Гаусс (5); G10: — new Гаусс (10);
Значениями переменных G5 и G10 являются теперь объекты класса Гаусс. См' также пример 1 в разд. 7.1.2.
Пример 2:
Пусть точка и поляр — это классы, декларированные а примере разд. 2.2.2. :
ref (точка) PI, Р2; ref (поляр) РЗ;
Р\ : — new поляр (3, 4); Р2 : — new точка (5, 6);
Оператор РЗ:— Р\ присвоит переменной РЗ ссылку на объект класса поляр, который сам является значением переменной Р1. Оператор РЗ :— Р2 привел бы к выдаче сообщения об ошибке во время его выполнения.
6.2. ОПЕРАТОРЫ ЦИКЛА .
6.2.2. Семантика
Конструкция (список объектов) аналогична по смыслу конструкции (АЛГОЛ-список цикла). Расширение оператора цикла облегчает обработку списочных структур.
Каждое неявное присваивание ссылок подчиняется правилам из разд. 6.1.2.2.
6.3. БЛОКИ С ПРЕФИКСАМИ
6.3.2. Семантика „
Экземпляр блока с префиксом является составным объектом, префиксная часть которого есть объект класса, указанного префиксом блока, а ядро — экземпляром ядра блока. Формальные параметры префиксной части получают исходные значения в соответствии с фактическими параметрами префикса.
Сочленение производится в соответствии с правилами, аналогичными правилам разд. 2.2.2.
При образовании блоков с префиксами необходимо соблюдать следующие ограничения:Объект, в котором встречается ссылка на него самого через некоторый локальный объект, не может быть префикс ной частью экземпляра блока с префиксом.
Идентификатор класса некоторого префикса блока должен идентифицировать класс, локальный в наименьшем блоке, охватывающем блок с префиксом. Если этот иденти фикатор является идентификатором системного класса, то'он относится к некоторой фиктивной декларации этого систем ного класса, как' бы находящейся в начале наименьшего охватывающего блока. В конкретных реализациях языка можно ограничить количество различных блочных уровней, на которых можно пользоваться такими префиксами (см. разд. 11 и 14).
*■ Экземпляр блока с префиксом является самостоятельным объектом (см. разд. 9). Программа считается вложенной в некоторый блок с префиксом (см. разд. 11), поэтому она является самостоятельным объектом.
Пример:
Пусть расстановка означает класс, декларированный в примере разд. 2.2.3. Тогда внутри блока с префиксом
расстановка (64) begin integer procedure оценка (Т);
text Г; :....;
end
можно обращаться к процедуре номер (декларированной в классе расстановка), использующей процедуру оценка, декларированную в ядре блока.