квалифицированные и неквалифицированные: в первом случае используется нотация с многоточием. При соответствующих объявлениях класса и функций, они, например, таковы:

b.f

b.g(x, y, ...)

b.h(u, v).i.j(x, y, ...)

Правило квалифицированного вызова, приведенное для процедур, применимо также к вызовам функций.

Текущий объект

Зарезервированное слово Current означает текущий экземпляр класса и может использоваться в выражении. Само Current - тоже выражение, а не сущность, допускающая запись. Значит присваивание Current, например, Current := some_value будет синтаксически неверным.

При ссылке на компонент (атрибут или программу) текущего экземпляра нет необходимости писать Current.f, достаточно написать f. Поэтому Current используется реже, чем в ОО-языках, где каждая ссылка на компонент должна быть явно квалифицированной. (Например, в Smalltalk компонент всегда квалифицирован, даже когда он применим к текущему экземпляру.) Случаи, когда надо явно называть Current включают:

[x]. Передачу текущего экземпляра в качестве аргумента в программу, как в a.f (Current). Обычное применение - создание копии (duplicate) текущего экземпляра, как в x: = clone (Current).

[x]. Проверку,- присоединена ли ссылка к текущему экземпляру, как в проверке x = Current.

[x]. Использование Current в качестве опорного элемента в 'закрепленном объявлении' в форме like Current (лекция 16).

Выражения с операторами

Выражения могут включать знаки операций или операторы.

Унарные операторы + и - применяются к целым и вещественным выражениям и не применяются к булевым выражениям.

Бинарные операторы, имеющие точно два операнда, включают операторы отношения:

= /= < > <= >=

где /= означает 'не равно'. Значение отношения имеет булев тип.

Выражения могут включать один или несколько операндов, соединенных операторами. Численные операнды могут соединяться следующими операторами:

+ - . / ^ // \

где // целочисленное деление, \ целый остаток, а ^ степень (возведение в степень).

Булевы операнды могут соединяться операторами: and, or, xor, and then, or else, implies. Последние три объясняются в следующем разделе; xor - исключающее или.

Предшествование операторов, основанное на соглашениях обычной математики, строится по 'Принципу Наименьшей Неожиданности'. Во избежание неопределенности и путаницы, в книге используются скобки, даже там, где они не очень нужны.

Нестрогие булевы операторы

Операторы and then и or else (названия заимствованы из языка Ada), а также implies не коммутативны и называются нестрогими (non-strict) булевыми операторами. Их семантика следующая:

Нестрогие булевы операторы

[x]. a and then b ложно, если a ложно, иначе имеет значение b.

[x]. a or else b истинно, если a истинно, иначе имеет значение b.

[x]. a implies b имеет то же значение, что и: (not a) or else b.

Первые два определения, как может показаться, дают ту же семантику, что и and и or. Но разница выявляется, когда b не определено. В этом случае выражения, использующие стандартные булевы операторы, математически не определены, но данные выше определения дают результат: если a ложно, то a and then b ложно независимо от b; а если a истинно, то a and then b истинно независимо от b. Аналогично, a implies b истинно, если a ложно, даже если b не определено.

Итак, нестрогие операторы могут давать результат, когда стандартные не дают его. Типичный пример:

(i /= 0) and then (j // i = k)

которое, согласно определению, ложно, если i равно 0. Если бы в выражении использовался and, а не and then, то из-за неопределенности второго операнда при i равном 0 статус выражения неясен. Эта неопределенность скажется во время выполнения:

1 Если компилятор создает код, вычисляющий оба операнда, то во время выполнения произойдет деление на ноль, и возникнет исключительная ситуация.

2 Если же генерируется код, вычисляющий второй операнд только тогда, когда первый истинен, то при i равном 0 возвратится значение ложь.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату