Иллюстрированный самоучитель по Maple 6/7

Процедуры и процедуры-функции

Объявления переменных локальными с помощью оператора local

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

Встречая такие операции присваивания, Maple-язык корректирует текст процедуры и вставляет в нее объявление переменных локальными с помощью ключевого слова local и выдает предупреждающую надпись о подобном применении:

> restart:m: = 0;
m: = 0
> modc: = proc(z)
> m: = evalf(sqrt(Re(zr2+Im(zr2)):RETURN(m)
> end:
Warning, 'm' is implicitly declared local to procedure 'mode'
mode: = proc (z) local т; т: = evalf(sqrt(9*(z)A2 + 3(z)A2)); RETURN(m) end proc
> modc(3.+I*4.): 5.000000000
> m;
0

Обратите внимание на то, что в тело процедуры было автоматически вставлено определение local m, задающее локальный статус переменной т. Оператором print можно вывести текст процедуры:

> print(modc);
proc(z) local m; m: = evalf(sqrt(R(z)^2 + J(z)^2)); RETURN(m) endproc

Объявления переменных глобальными с помощью слова global

Говорят, что запретный плод сладок! Что бы ни говорили о нежелательности – работы с глобальными переменными, бывает, что их применение желательно или даже необходимо. Чтобы сделать переменные внутри процедуры глобальными, достаточно объявить их с помощью ключевого слова global, после которого перечисляются идентификаторы переменных.

Следующий пример поясняет применение оператора global в процедуре:

> а: = 1;b: = 1:
а: = 1
b: = 1
> fg: = proc(x,y)
> global a,b;
> a:-x^2:b: = y^2:
> RETURN(sqrt(a+b));
> end;
fg: = proc (x, y) global a, b; a: = x^2; b: = y^2; RETURN(sqrt(a + b)) end proc
> fg(3.4):
5 > [a.b]:
[9.16]

В примере переменным а и b вначале присвоены значения 1. Поскольку они в процедуре объявлены глобальными, то внутри процедуры они принимают новые значения х2 и у2. В результате при выходе из процедуры они имеют уже новые значения. Это и есть побочный эффект при исполнении данной процедуры. Если пользователь не знает (или не помнит), что та или иная процедура имеет побочный эффект, то он рискует получить самые неожиданные (и неверные) результаты своих вычислений.

Примечание
Следует отметить, что нельзя делать глобальными переменные, указанные в списке параметров процедуры, поскольку они уже фактически объявлены локальными. Такая попытка приведет к появлению сообщения об ошибке следующего вида "Error, argument and global'x' have the same name". При этом соответствующие переменные останутся локальными
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.