Для контроля и отладки процедур прежде всего надо уметь вывести их текст. Для этого, что уже отмечалось, служит команда
print(name);
где name — имя процедуры.
Перед тем как использовать ее, надо также исполнить команду
> interface(verboseproc=2,prettyprint=1,version);
1, 3, Classic Worksheet Interface, Maple 9.50, Windows, Aug 9 2004 Build ID 163356
Ее смысл детально будет пояснен ниже. Пока же отметим, что эта команда обеспечивает
полный вывод текста процедур библиотеки. Встроенные в ядро процедуры, написанные не на Maple-языке, в полном тексте не представляются. Поясним это следующими примерами:
> print(evalf);
proc option builtin, remember; 171 end proc
> print(erf);
proc(x::algebraic)
local Re_x, Im_x, sr, si, xr, xi;
option `Copyright (c) 1994 by the University of Waterloo. All rights reserved.`;
if nargs <> 1 then error "expecting 1 argument, got %1", nargs
elif type(x, 'complex(float)') then evalf('erf'(x))
elif x = 0 then 0
elif type(x, 'infinity') then
if type(x, ' cx_infinity') then undefined + undefined*I
elif type(x, 'undefined') then NumericTools:-ThrowUndefined(x)
elif type(Re(x), 'infinity') then CopySign(1, Re(x))
elif type(x, 'imaginary') then x
else infinity + infinity*I
end if
elif type(x, 'undefined') then NumericTools:-ThrowUndefined(x, 'preserve' = 'axes')
elif `Symbolic/Sign`(x) = -1 then -erf(-x)
else 'erf'(x)
end if
end proc
Здесь вначале выполнен вывод сокращенного листинга встроенной в ядро процедуры evalf, а затем выведен полный листинг процедуры вычисления функции ошибок erf. Эта функция имеет довольно короткую процедуру — многие важные функции и операторы задаются гораздо более сложными и большими процедурами. Их просмотр очень полезен читателям, которые занимаются программированием — листинги процедур на языке Maple являются наглядными примерами профессионально выполненных программ.
Но вернемся к функции interface. Она служит для управления выводом и задается в виде
interface(arg1, arg2, …)
где аргументы задаются в виде равенств вида name=value и слов-указателей:
Рассмотрим только некоторые, наиболее важные возможности этой функции.
Указание verboseproc=n
задает степень детальности вывода листинга процедур. При n=0 текст не выводится, при n=1 выводится текст только заданных пользователем процедур, а при n=2 — всех процедур на Maple-языке. Пример этого был дан выше. Указание prettyprint=0 или 1 управляет выводом стандартных сообщений. Указание plotdevice=string управляет выводом графики, например plotdevice=gif указывает на то, что запись графиков в виде файлов будет происходить в формате .gif.
Одним из основных средств отладки процедур является функция трассировки trace(name). Детальность ее работы задается системной переменной printlevel (уровень вывода). При printlevel:=n (значение n=1 по умолчанию) выводится результат только непосредственно исполняемой функции или оператора. Для вывода информации о выполнении k-го уровня вложенности надо использовать значение этой переменной от 5*k до 5*(k+1). Так, при n от 1 до 5 выводятся результаты трассировки первого уровня, при n от 6 до 10 второго и т.д. Максимальное значение n — 100 обеспечивает трассировку по всем уровням вложенности процедуры name.
Следующий пример показывает осуществление трассировки для функции int(x^n,x):
> printlevel:=5;
printlevel := 5
> trace(int);
{--> enter trace, args = int
<-- exit trace (now at top level) = int}
int
> int(x^n,x);
Действие функции трассировки отменяется командой untrace:
> untrace(int);
{--> enter untrace, args = int
<-- exit untrace (now at top level) = int}
int
> int(х^n,x);
> enter int, args = x^n, x <-- exit int (row at top level) = x^(n+1)/(n+1)}
> printlevel:=1;
printlevel := 1
> int(x^n,x);
При отладке алгоритмов выполнения вычислений надо тщательно следить за сообщениями об ошибках. Для этого в Maple предусмотрены функция traceerr и системная переменная lasterr, в которой сохраняется последнее сообщение об ошибке. При каждом обращении к tracerr переменная lasterr очищается: