PROCEDURE
Инструкцию PROCEDURE можно использовать во внутренней программе (подпрограмме или функции) для защиты всех существующих переменных путем удаления их из числа известных для последующих инструкций. При выполнении инструкции RETURN восстанавливается исходная среда переменных. Все переменные, использованные в программе (которые не были проявлены), освобождаются.
Режим EXPOSE изменяет приведенный порядок действий. Любая переменная, указанная именем, проявляется, т.е. любое обращение к ней (включая назначение и освобождение) направляется в среду переменных, которая принадлежит вызывающей программе. Указывая режим EXPOSE, Вы должны определить по крайней мере одно имя, т.е. символ, отделенный от другого имени одним или несколькими пробелами. При необходимости Вы можете заключить единственное имя в скобки, чтобы определить дополнительный список переменных. Все переменные, не указанные с помощью своих имен в инструкции PROCEDURE EXPOSE, остаются защищенными. Следовательно, некоторый ограниченный набор переменных вызываемой программы может быть доступным, и эти переменные могут изменяться (или создаваться новые переменные в этом множестве). Все выполненные изменения будут видимы для вызывающей программы после возвращения из подпрограммы.
Все переменные проявляются последовательно слева направо. Не считается ошибкой указание одного и того же имени переменной несколько раз или указание имени, которое не использовано в качестве переменной в вызывающей программе.
Пример: /* Это основная программа */ j=1; x.1='a' call toft say j k m /* выведет на экран "1 7 M" */ exit
toft: procedure expose j k x.j say j k x.j /* выведет на экран "1 K a" */ k=7; m=3 /* переменная "M" не проявляется */ return
Заметим, что если бы в предыдущем примере X.J в списке EXPOSE было помещено перед J, то значение J не было бы видимым в настоящий момент, таким образом и переменная X.1 не проявилась бы.
Если имя заключено в скобки (пробелы внутри или снаружи скобок необязательны, но при желании их можно добавить), то после проявления этой переменной ее значение немедленно будет использовано в качестве дополнительного списка переменных.
Принцип расположения переменных в дополнительном списке тот же, что и для основного списка, однако скобки или пробелы в начале и конце списка не допускаются. Переменные, перечисленные в дополнительном списке, тоже проявляются слева направо.
Пример: j=1;k=6;m=9 a ='j k m' test:procedure expose (a) /* будут проявлены j, k и m */
Если в списке имен указана основа, то проявляются все возможные составные переменные, чьи имена начинаются с этой основы. (Основа - это символ, содержащий только одну точку в качестве последнего знака).
Пример: lucky7:Procedure Expose i j a. b. /* Проявляет "I", "J" и все переменные, чьи */ /* имена начинаются с "A." или "B." */ A.1='7' /* Назначит "A.1" для среды вызывающей */ /* программы, даже если эта переменная */ /* ранее не существовала. */
При необходимости переменные могут проявляться и после выполнения ряда программ, но при этом нужные переменные должны быть включены во все промежуточные инструкции PROCEDURE.
На каждом уровне вызова программы допускается только одна инструкция PROCEDURE; все остальные (и те, которые встретились за пределами внутренних программ) считаются ошибочными.
Примечания:
- Внутренняя программа может не содержать инструкцию PROCEDURE, в этом случае она будет работать с теми переменными, которые имеются в распоряжении вызывающей программы.
- Инструкция PROCEDURE должна быть первой инструкцией, выполняющейся после CALL или вызова функции, т.е. первой инструкцией, следующей за меткой.
Для получения более подробной информации о вызове программ смотрите описание инструкции CALL.