Для того чтобы создать процедуру (подпрограмму), которую вы могли бы использовать неоднократно, в программе 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;
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple12.gif)
> plotdiff(x^3-2*x+1,x,-1,1);
![[Maple Plot]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple13.gif)
В этой процедуре локальной переменной присваивается значение производной выражения.
Локальные переменные- это временные ячейки памяти для сохранения значений переменных внутри процедуры, они образуются при каждом вызове процедуры. Правила вычисления локальных переменных внутри процедур отличаются от правил вычисления переменных в командной строке (в интерактивном режиме).
Введем команду присваивания некоторой переменной а значения b
> a:=b;
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple14.gif)
после этого присвоим переменной b значение с
> b:=c;
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple15.gif)
А теперь введем
> a+1;
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple16.gif)
Таким образом, в интерактивном режиме Maple вычисляет все произведенные присвоения переменной а до конца и выводит последнее присвоенное значение. Используя командуeval можно вызвать первое присвоенное значение
> eval(a,1);
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple17.gif)
второе присвоенное значение
> eval(a,2);
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple18.gif)
а также любой другой уровень присвоения. Команда eval без указания уровня вычисляет до последнего уровня.
> eval(a);
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple19.gif)
Теперь посмотрим, что будет происходить, если переменная является локальной переменной некоторой процедуры. В качестве примера запишем процедуру
> f:=proc()
local a,b;
a:=b;
b:=c;
a+1;
end;
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple20.gif)
> f();
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple21.gif)
Такой результат связан с тем, что при вызове процедуры Maple вычисляет только первое присвоенное значение локальных переменных. Функция eval позволяет вычислить последнее присвоенное значение.
> eval(f());
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple22.gif)
Исключение - Ditto -оператор ( " ). Он является одной из переменных операционной среды (смотрите ниже), локальным для процедур. При вызове процедуры Maple назначает переменной " значение NULL (пустое выражение). В процессе выполнения процедуры Maple присваивает переменной " значение последнего выражения, вычисленного до последнего уровня присвоения:
> f:=proc()
local a,b;
print(`Вначале ["] имеет значение`,[%]);
a:=b;
b:=c;
a+1;
print(`Теперь ["] имеет значение`,[%]);
end;
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple23.gif)
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple24.gif)
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple252+.gif)
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple26.gif)
> f();
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple27.gif)
![[Maple Math]](http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/images/8_1maple28.gif)
Глобальные переменные доступны изнутри любой процедуры и на интерактивном уровне. Таким образом глобальные переменные внутри процедуры вычисляются также, как в интерактивном режиме, то есть до последнего уровня присвоения, кроме тех случаев, когда глобальная переменная является таблицей, массивом или процедурой. В этих последних трех случаях переменная вычисляется до последнего присвоенного имени (last name evaluation).
