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()
.