Введем команду присваивания некоторой переменной а значения 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).
В строке определения процедуры стоят формальные параметры. Их имена могут быть произвольными (при вызове процедуры используются фактические имена параметров), однако важно их количество и определение типа. Параметров может не быть вовсе, однако и в этом случае в определении процедуры и при вызове ее нужно обязательно записывать пустые скобки. В общем случае, при вызове процедуры число фактических параметров не обязательно должно совпадать с числом формальных параметров. Mapleвыдает ошибку, если параметр пропущен только в случае, если он необходим на данный момент.
Вычисление параметров происходит следующим образом. Фактические параметры вычисляются полностью еще до передачи внутрь процедуры. Внутри процедуры, везде где появляются в выражениях формальные параметры, они заменяются соответствующими значениями фактических параметров.
Для оперирования параметрами процедуры в Maple введены специальные функции:
args[i] или args[i..j] - последовательность фактических параметров (аргументов), передаваемых процедуре
и nargs - число параметров, передаваемых процедуре.
При помощи функции args[i] можно выделить часть последовательности параметров, передаваемых процедуре, что очень удобно при программировании некоторых процедур, например, в следующей процедуре определяется максимальное из последовательности чисел
> maximum := proc () local r, i;
r := evalf(args[1]);
for i from 2 to nargs do if evalf(args[i]) > r then r := evalf(args[i]) fi od;
r
end;maximum(Pi,exp(1),3);
Формальные параметры процедуры можно также применить для передачи внутрь процедуры имени, с целью присвоения результата выполнения процедуры. Запишем процедуру
> Square:=proc(x::anything, y::name)
y:=x^2;
end;
В этой процедуре результат присваивается второму параметру. Пусть, например этот параметр ans
> Square(d,ans);ans;
Однако при таком использовании параметра нужно соблюдать осторожность. Если мы не отменим присвоение, то Maple сообщит ошибку при повторном вызове процедуры.
> Square(d,ans);ans;
Error, Square expects its 2nd argument, y, to be of type name, but received d^2
Ошибка связана с тем, что Maple внутри процедуры не перевычисляет параметр y и пытается присвоить одно выражение другому. Чтобы этого не происходило нужно имя фактического параметра, в данном случае ans заключать в прямые кавычки, то есть писать 'ans`.
А теперь запишем первым параметром процедуры переменную а , которой произведено двухуровневое присвоение
> a:=b:
b:=c:
Square(a,'ans');ans;
Мы видим, что в этом случае выполняется вычисление до последнего уровня присвоения. Это объясняется тем, что передаваемый внутрь процедуры фактический параметр вычисляется на интерактивном уровне еще до передачи внутрь процедуры.
http://www.exponenta.ru/soft/Maple/manson/poweredition/chapter8/8_1_2_1.asp