prog:: traceНаблюдайте функции
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
prog::trace(obj, <Recursive = FALSE>) prog::trace({obj1, obj2, …}, <Recursive = FALSE>) prog::trace(options)
prog::trace(obj) управляет объектом obj MuPAD® наблюдать ввод и выход из этого объекта.
prog::trace имеет новый синтаксис и новый набор опций. Старый синтаксис был удален.
prog::trace позволяет вам наблюдать функции, области, доменные методы и функциональные среды. Используйте функцию prog::trace для отладки. Смотрите Пример 1.
prog::trace позволяет вам задать набор функций, областей, методов или функциональных сред, которые вы хотите наблюдать. Смотрите Пример 2.
prog::trace позволяет вам наблюдать отношения между вызовами прослеженных объектов.
Чтобы проследить объект obj, используйте вызов функции prog::trace(obj). После того вызова, каждый раз, когда вызов функции вводит или выходит из объекта obj, MuPAD распечатывает сообщение и возвращает аргументы и возвращаемое значение того вызова. Смотрите Пример 3.
prog::trace позволяет вам наблюдать область или функциональную среду. Когда вы вызываете функцию prog::trace для области, функция наблюдает все методы области. Когда вы вызываете prog::trace для функциональной среды, он наблюдает все слоты функциональной среды. Чтобы проследить только конкретные методы (слоты), обеспечьте набор этих методов (слоты). Дополнительную информацию см. в странице справки slot. Смотрите Пример 8.
Чтобы предотвратить трассировку всех слотов функциональной среды, установите значение опции Recursive к FALSE. Смотрите Пример 7.
Функциональный prog::untrace(obj) отключает трассировку объекта obj. Здесь obj является функцией, набором функций, области, доменного метода или функциональной среды. Функциональный prog::traced обнаруживает, прослеживает ли система в настоящее время конкретный объект.
Задайте функциональный f и наблюдайте эту функцию:
f := x -> if x > 0 then x else -f(-x) end: prog::trace(f): f(-2)
enter f(-2) enter f(2) computed 2 computed -2
![]()
Измените функцию и повторно присвойте новую функцию f. Несмотря на то, что вы используете то же имя функции (f), MuPAD не прослеживает новую функцию:
f := x -> if x > 0 then x else f(-x) end: f(-2)
![]()
Чтобы проследить новую функцию, вызовите prog::trace снова. Теперь, механизм трассировки наблюдает обновленную функцию:
prog::trace(f): f(-2)
enter f(-2) enter f(2) computed 2 computed 2
![]()
Для дальнейших вычислений остановите наблюдение за функцией:
prog::untrace(f)
Если вы хотите проследить больше чем одну функцию, используйте набор, чтобы задать эти функции в одном вызове функции:
prog::trace({sin, cos, exp}):
sin(5*PI/2);
cos(5*PI);
exp(5)enter sin((5*PI)/2) enter sin(PI/2) remembered 1 computed 1
![]()
enter cos(5*PI) enter cos(PI) remembered -1 computed -1
![]()
enter exp(5) computed exp(5)
![]()
Чтобы остановить наблюдение за всеми функциями, используйте prog::untrace без аргументов:
prog::untrace()
Задайте короткую функцию, которая вызывает себя рекурсивно, и наблюдайте вызовы:
fib:= proc(n)
begin
if n < 2 then
n
else
fib(n - 1) + fib(n - 2)
end_if
end_proc:
prog::trace(fib):
fib(3)enter fib(3)
enter fib(2)
enter fib(1)
computed 1
enter fib(0)
computed 0
computed 1
enter fib(1)
computed 1
computed 2
![]()
Чтобы ограничить количество вызовов вложенной функции, отображенных prog::trace, используйте опцию Depth. Чтобы задать значение Depth, используйте отдельный вызов функции prog::trace:
prog::trace(fib): prog::trace(Depth = 2); fib(12)
enter fib(12) enter fib(11) computed 89 enter fib(10) computed 55 computed 144
![]()
Опция Depth независима от процедуры fib. Теперь, если вы используете prog::trace, чтобы проследить какую-либо другую процедуру, prog::trace отображает вложенные вызовы той процедуры с помощью Depth = 2. Удалите эту глобальную опцию для дальнейших вычислений:
prog::untrace(fib): prog::trace(Depth = 0)
Чтобы отобразить использование памяти, используйте опцию Mem:
prog::trace(Mem): prog::trace(sin): sin(3/2*PI)
enter remember::sin((3*PI)/2) [mem: 3267052] enter remember::sin(PI/2) [mem: 4033596] remembered 1 [mem: 4033436] computed -1 [mem: 4033072] -1
Опция Mem независима от прослеженной процедуры. Теперь, если вы используете prog::trace, чтобы проследить какую-либо другую процедуру, prog::trace отображает использование памяти на каждом шаге той процедуры. Удалите эту глобальную опцию для дальнейших вычислений::
prog::untrace(sin): prog::trace(Mem = FALSE)
Опция NoArgs подавляет вывод аргументов прослеженных объектов:
prog::trace(linalg):
prog::trace(NoArgs);
linalg::eigenvalues(matrix([[1, 0, 0],
[0, -1, 2],
[0, 1, 1]]))enter linalg::eigenvalues
enter linalg::checkForFloats
return
enter linalg::charpoly
enter linalg::charpolyBerkowitz
return
return
return
![]()
Опция NoArgs независима от прослеженной процедуры. Теперь, если вы используете prog::trace, чтобы проследить какую-либо другую процедуру, prog::trace скрывает аргументы на каждом шаге той процедуры. Удалите эту глобальную опцию для дальнейших вычислений:
prog::untrace(linalg): prog::trace(NoArgs = FALSE)
Если вы используете опцию Parent, prog::trace показывает имя процедуры, которая вызывает прослеженный объект:
prog::trace(cos): prog::trace(Parent): f := x -> cos(2*x): g := (x, y) -> f(x) + f(y): g(3/2*PI, -3/2*PI)
enter cos(3*PI) (called from f) enter cos(PI) (called from cos) remembered -1 computed -1 enter cos(-3*PI) (called from f) enter cos(3*PI) (called from cos) remembered -1 computed -1
![]()
prog::trace(f): prog::trace(g): g(-PI, PI)
enter g(-PI, PI)
enter f(-PI) (called from g)
enter cos(-2*PI) (called from f)
enter cos(2*PI) (called from cos)
enter cos(0) (called from cos)
remembered 1
computed 1
computed 1
computed 1
enter f(PI) (called from g)
enter cos(2*PI) (called from f)
remembered 1
computed 1
computed 2
![]()
Опция Parent независима от прослеженных процедур. Теперь, если вы используете prog::trace, чтобы проследить какой-либо другой объект, prog::trace показывает отношения между вызовами прослеженных объектов. Удалите эту глобальную опцию для дальнейших вычислений:
prog::untrace(cos): prog::trace(Parent = FALSE)
По умолчанию функция prog::trace прослеживает все слоты функциональной среды. Например, проследите besselJ, функционируют и наблюдают следующий вызов функции:
prog::trace(besselJ); besselJ(1, 2.3)
enter besselJ(1, 2.3) enter besselJ::float(1, 2.3) computed 0.5398725326 computed 0.5398725326
![]()
Чтобы не использовать трассировку всех слотов, установите значение опции Recursive к FALSE:
prog::untrace(besselJ); prog::trace(besselJ, Recursive=FALSE); besselJ(1, 4.5)
enter besselJ(1, 4.5) computed -0.2310604319
![]()
Для дальнейших вычислений остановите наблюдение за функцией besselJ:
prog::untrace(besselJ)
Можно проследить области и доменные методы. Например, создайте следующую маленькую область:
T := newDomain("T"):
T::new := proc(h, m = 0) name T; begin new(T, h*60 + m) end:
T::intern := x -> [op(x) div 60, op(x) mod 60]:
T::print := x -> expr2text(T::intern(x)[1]).":".
substring(expr2text(100 + T::intern(x)[2]), 2, 2):
T::_plus := () -> new(T, _plus(map(args(), op))):
T::expr := op:
T::_mult := () -> new(T, _mult(map(args(), expr))):
prog::trace(T):
T(1, 30) + T(0, 45)*T(1, 05)enter T(1, 30) computed 1:30 enter T(0, 45) computed 0:45 enter T(1, 5) computed 1:05 enter T::_mult(0:45, 1:05) computed 48:45 enter T::_plus(1:30, 48:45) computed 50:15
![]()
MuPAD не прослеживает процесс отображения прослеженных выводов. Поэтому T::intern и методы T::print не появляются в прослеженных выходных параметрах.
Теперь, проследите арифметические методы только. При определении методов, чтобы проследить, используйте их имена слота, такие как slot(T, "_plus") или T::_plus:
prog::untrace():
prog::trace({T::_plus, T::_mult}):
T(1, 30) + T(0, 45)*T(1, 05)enter T::_mult(0:45, 1:05) computed 48:45 enter T::_plus(1:30, 48:45) computed 50:15
![]()
prog::untrace():
|
Функция MuPAD, область, метод или функциональная среда, чтобы наблюдать. Задайте методы их именами |
|
Набор функций MuPAD, областей, методов или функциональных сред, чтобы наблюдать. |
|
Опция, заданная как Отобразите вызовы вложенной функции только до глубины рекурсии |
|
Покажите текущее использование памяти. После того, как вы установите эту опцию, все новые и регенерированные выходные параметры для прослеженных объектов показывают информацию о текущем использовании памяти. Смотрите Пример 4. |
|
Не показывайте аргументы вызовов прослеженных объектов и возвращенных значений. Без этой опции все выходные параметры для прослеженных объектов показывают аргументы и возвращенные значения для каждого вызова прослеженного объекта. Смотрите Пример 5. |
|
Покажите имя процедуры, которая вызывает прослеженный объект. После того, как вы устанавливаете эту опцию, все новые и регенерированные выходные параметры для прослеженных объектов показывают имена процедур, которые вызывают прослеженные объекты. Смотрите Пример 6. |
|
Опция, заданная как Не прослеживайте все слоты функциональной среды или области. По умолчанию, |
prog::trace возвращает пустой объект null().