Встают важные вопросы: каково соответствие между фактическими и формальными аргументами? Какие операции допустимы над формальными аргументами? Каково их влияние на соответствующие фактические аргументы?
Ответ на первый вопрос: эффект связывания фактических - формальных аргументов таков же как соответствующего присваивания. Обе операции называются присоединением (attachment)
. В предыдущем вызове можно считать, что запуск программы начинается с выполнения команд, неформально эквивалентных присваиваниям:x1 := a1; x2 := a2;... xn := an
Ответ на второй вопрос: внутри тела программы любой формальный аргумент
[x].
Присваивание[x].
Процедуры создания, гдеЧитатели, знакомые с механизмом передачи, известным как вызов по значению, поймут, что здесь ограничения более строгое: при вызове по значению формальные аргументы инициализируются значениями фактических, но затем могут быть целью любых операций. |
Ответ на третий вопрос - что может программа делать с фактическими аргументами? - вытекает из того, что присоединение используется для задания семантики связывания формальных и фактических аргументов. Присоединение (см. лекцию 8
) означает копирование либо ссылки, либо объекта. Это зависит от того, являются ли соответствующие типы развернутыми:[x].
Для ссылок (обычный случай) при передаче аргументов копируется ссылка, -[x].
Для развернутых типов (включающих основные типыВ первом случае, запрет операций прямой модификации означает, что нельзя модифицировать ссылку (reference)
через повторное присоединение или создание. Но если ссылка не пустая, то разрешается модифицировать присоединенный объект.Рис. 13.1.
Допустимые операции на аргументе ссылкиЕсли
xi.p (...)
где
Вызов
Существует много причин, по которым не следует позволять программам прямую модификацию их аргументов. Одна из самых убедительных - Конфликтующие присваивания
. Предположим, что язык допускает присваивания аргументам, и процедура13.1)dont_I_look_innocuous (a, b: INTEGER) is -- я выгляжу
-- безвредной, но не стоит мне доверять.
do
a := 0; b := 1
end
Теперь рассмотрим вызов
Разрешение программе изменять аргументы приводит к ограничениям на фактические аргументы. В этом случае он должен быть элементом, способным изменять свое значение, что допустимо для переменных, но не постоянных атрибутов (см. лекцию 18
). Недопустимым фактическим аргументом становится сущностьСледствием этих правил является признание того, что только три способа допускают модификацию значения ссылки
Это также означает, что процедура не возвращает ни одного результата, функция - официальный результат, представленный сущностью
[x].
Использовать функцию, возвращающую объект с несколькими полями (обычно, возвращается ссылка на такой объект).[x].
Использовать процедуру, изменяющую поля объектов соответствующих атрибутов. Затем клиент может выполнять запросы к этим полям.Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии