Вызов
Существует много причин, по которым не следует позволять программам прямую модификацию их аргументов. Одна из самых убедительных - Конфликтующие присваивания. Предположим, что язык допускает присваивания аргументам, и процедура13.1)
dont_I_look_innocuous (a, b: INTEGER) is -- я выгляжу
-- безвредной, но не стоит мне доверять.
do
a := 0; b := 1
end
Теперь рассмотрим вызов
Разрешение программе изменять аргументы приводит к ограничениям на фактические аргументы. В этом случае он должен быть элементом, способным изменять свое значение, что допустимо для переменных, но не постоянных атрибутов (см. лекцию 18). Недопустимым фактическим аргументом становится сущность
Следствием этих правил является признание того, что только три способа допускают модификацию значения ссылки
Это также означает, что процедура не возвращает ни одного результата, функция - официальный результат, представленный сущностью
[x]. Использовать функцию, возвращающую объект с несколькими полями (обычно, возвращается ссылка на такой объект).
[x]. Использовать процедуру, изменяющую поля объектов соответствующих атрибутов. Затем клиент может выполнять запросы к этим полям.
Первый прием уместен, когда речь идет о составном результате. Например, функция не может возвращать два значения, соответствующих заглавию и году публикации книги, но может возвращать одно значение типа
Инструкции
ОО-нотация, разработанная в этой книге, императивна: вычисления специфицируются через команды (commands), также называемые инструкциями (instructions). (Мы избегаем обычно применимого термина оператор (предложение) (statement), поскольку в слове есть оттенок выражения, описывающего факты, а хотелось подчеркнуть императивный характер команды.)
Для имеющих опыт работы с современными языками инструкции выглядят как хорошие знакомые. Исключение составляют некоторые специальные свойства циклов, облегчающие их верификацию. Вот список инструкций: Вызов процедуры, Присваивание, Условие, Множественный выбор, Цикл, Проверка, Отладка, Повторное выполнение, Попытка присваивания.
Вызов процедуры
При вызове указывается имя подпрограммы, возможно, с фактическими аргументами. В инструкции вызова подпрограмма должна быть процедурой. Вызов функции является выражением. Хотя сейчас нас интересуют инструкции, следующие правила применимы в обоих случаях.
Вызов может быть квалифицированным или неквалифицированным. Для неквалифицированного вызова подпрограммы из включающего класса в качестве цели используется текущий экземпляр класса. Этот вызов имеет вид:
Квалифицированный вызов явно называет свою цель, заданную некоторым выражением. Если
Также разрешаются квалифицированные вызовы с многоточием в форме:
Экспорт управляет применением квалифицированных вызовов. Напомним, что компонент
Правило Квалифицированного Вызова
Квалифицированный вызов вида
1 Компонент, стоящий после первой точки,
2 В вызове с многоточием, каждый компонент после второй точки, то есть каждое
