В
строке определения процедуры стоят формальные
параметры. Их имена могут быть произвольными (при
вызове процедуры используются фактические имена
параметров), однако важно их количество и
определение типа. Параметров может не быть вовсе,
однако и в этом случае в определении процедуры и
при вызове ее нужно обязательно записывать
пустые скобки. В общем случае, при вызове
процедуры число фактических параметров не
обязательно должно совпадать с числом
формальных параметров. 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;
Мы видим, что в этом случае выполняется
вычисление до последнего уровня присвоения. Это
объясняется тем, что передаваемый внутрь
процедуры фактический параметр вычисляется на
интерактивном уровне еще до передачи внутрь
процедуры.
|