
228 Гл. 3. Машинно-ориентированные алгоритмические языки
3.5.1.
Параметры-переменные
Рассмотрим три просто устроенных оператора
m :=
rcst(tn),
(*,//):=
(1,0),
(a,b):=(b,a).
Здесь m, х, у и a, b должны быть переменными, поскольку им
что-то присваивается. Так как переменной m присваивается ре-
зультат
применения операции
rest,
m может быть переменной
для объектов вида
string
(соотв. типа
string);
можно коротко
сказать, что пг имеет вид var
string.
Точно также х и у должны
быть переменными для объектов, имеющих изображения 0 и 1,
т. е. для объектов целого или вещественного сорта. Лишь в спе-
циальных случаях вроде „оператора взаимного обмена"
(a, b) := (b,a) совершенно не важно, какого сорта те объекты,
для которых а и b являются переменными.
Итак,
переменные, используемые в качестве параметров опе-
ратора, представляют собой, вообще говоря, переменные вполне
определённого сорта. Один из основных принципов
алгола-68
и
паскаля состоит в требовании явного указания сорта парамет-
ров-переменных.
Операторы, содержащие присваивания переменным, которые
не описаны внутри этих операторов и тем самым нелокальны
для них, имеют
побочные
эффекты;
упомянутые переменные яв-
ляются параметрами. Насколько важно запрещение побочных
эффектов
для предложений, настолько вредно было бы не допу-
скать их и для операторов; процедура без побочных эффектов
была бы безрезультатной.
Параметры-переменные
замещаются
при
вызове переменными. Можно сказать, что
вызванная
про-
цедура
использует
переменные
из
окружения
вызова,
она
носит
паразитический
характер
по
отношению
к
параметрам-пере-
менным.
Параметры-переменные обладают чертами, с которыми мы
ещё не сталкивались при рассмотрении обычных параметров.
Обычные параметры заменяются при вызове фактическими зна-
чениями,
так что вызовы вроде
gcd(l8,l8)
или
gcd(a,a)
вполне корректны.
Однако разные обозначения для переменных, например х и
у в (х, у) := (1, 0) или аи b в (о, b) := (b,a), означают, что
речь идёт о существенно различных объектах. Отсюда
вытекает следующий