Для
того чтобы создать процедуру (подпрограмму),
которую вы могли бы использовать неоднократно, в
программе Maple используется конструкция proc/end . Процедура записывается следующим
образом
>
> Имя:=proc(параметр1::type1,параметр2::type2,...)
local l1,l2...; global g1,g2...; options op1, op2, ...; тело
процедуры; end;
control character unexpected
Она начинается с имени, которому
присваивается ключевое слово proc (сокращенное
от procedure) за которым в скобках перечисляются
формальные параметры процедуры с необязательным
указанием их типа - через дважды записанное
двоеточие). Далее может идти необязательное
перечисление локальных и глобальных переменных,
используемых в теле процедуры, заканчиваемое
знаком ; .Вслед за этим, если необходимо, идет
перечисление опции процедуры, заканчиваемое
знаком ;. Далее идет тело процедуры - алгоритм
выполнения процедуры. Процедура обязательно
заканчивается словом end и следующим за ним
знаком конца команды (двоеточие или точка с
запятой). Результатом выполнения процедуры,
является результат последней выполненной
операции, если не применены одна из команд
возврата RETURN или ERROR (смотрите ниже).
В следующем примере очень простая
процедура plotdiff строит кривые функции и ее
производной на одном графике.(рис. 68).
> restart;plotdiff:=proc(y,x,a,b)
local yp;
yp:=diff(y,x);
plot([y,yp],x=a..b);
end;
> plotdiff(x^3-2*x+1,x,-1,1);
В этой процедуре локальной переменной
присваивается значение производной выражения.
Локальные переменные- это
временные ячейки памяти для сохранения значений
переменных внутри процедуры, они образуются при
каждом вызове процедуры. Правила вычисления
локальных переменных внутри процедур отличаются
от правил вычисления переменных в командной
строке (в интерактивном режиме).
Введем команду присваивания некоторой
переменной а значения b
> a:=b;
после этого присвоим переменной b
значение с
> b:=c;
А теперь введем
> a+1;
Таким образом, в интерактивном режиме Maple
вычисляет все произведенные присвоения
переменной а до конца и выводит последнее
присвоенное значение. Используя команду eval
можно вызвать первое присвоенное значение
> eval(a,1);
второе присвоенное значение
> eval(a,2);
а также любой другой уровень присвоения.
Команда eval без указания уровня вычисляет до
последнего уровня.
> eval(a);
Теперь посмотрим, что будет происходить,
если переменная является локальной переменной
некоторой процедуры. В качестве примера запишем
процедуру
> f:=proc()
local a,b;
a:=b;
b:=c;
a+1;
end;
> f();
Такой результат связан с тем, что при
вызове процедуры Maple вычисляет только первое
присвоенное значение локальных переменных.
Функция eval позволяет вычислить последнее
присвоенное значение.
> eval(f());
Исключение - Ditto -оператор
( " ). Он является одной из переменных
операционной среды (смотрите ниже), локальным для
процедур. При вызове процедуры Maple назначает
переменной " значение NULL (пустое
выражение). В процессе выполнения процедуры Maple
присваивает переменной " значение
последнего выражения, вычисленного до
последнего уровня присвоения:
> f:=proc()
local a,b;
print(`Вначале ["] имеет значение`,[%]);
a:=b;
b:=c;
a+1;
print(`Теперь ["] имеет значение`,[%]);
end;
> f();
Глобальные переменные доступны
изнутри любой процедуры и на интерактивном
уровне. Таким образом глобальные переменные
внутри процедуры вычисляются также, как в
интерактивном режиме, то есть до последнего
уровня присвоения, кроме тех случаев, когда
глобальная переменная является таблицей,
массивом или процедурой. В этих последних трех
случаях переменная вычисляется до последнего
присвоенного имени (last name evaluation).
|