MAXLEVEL
Предотвратите бесконечную рекурсию во время оценки
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
Переменная окружения MAXLEVEL
определяет максимальную глубину замены идентификаторов. Когда эта глубина замены достигнута, ошибка происходит.
Возможные значения: целочисленные большие 2; максимальное значение зависит от operationg системы, смотрите ниже.
Когда объект MuPAD® оценен, идентификаторы, происходящие в нем, заменяются их значениями. Это происходит рекурсивно, т.е. если сами значения содержат идентификаторы, то они заменяются также. MAXLEVEL
определяет максимальную глубину рекурсии этого процесса. Если глубина замены MAXLEVEL
достигнут, затем ошибка происходит.
Цель MAXLEVEL
должен обеспечить эвристику для распознавания бесконечной рекурсии относительно замены идентификаторов их значениями, как в delete a: a := a + 1; a
. Если бы в этом примере глубина замены не была бы ограничена, то a + 1
был бы заменен a
бесконечно часто, и система “зависла” бы.
Точно так же переменная окружения MAXDEPTH
обеспечивает эвристику для распознавания бесконечной рекурсии относительно вызовов функции; смотрите соответствующую страницу справки для деталей.
Между LEVEL
существует близкая связь и
MAXLEVEL
. Если глубина замены LEVEL
достигнут во время процесса оценки, затем остановки рекурсии и любые остающиеся идентификаторы остаются неоцененными, но никакая ошибка не происходит.
Таким образом, если MAXLEVEL > LEVEL
, затем MAXLEVEL
не оказывает влияния. По умолчанию, LEVEL
и MAXLEVEL
имейте то же значение 100
на интерактивном уровне. Однако значение по умолчанию LEVEL
в рамках процедуры 1
, и таким образом обычно MAXLEVEL
не оказывает влияния в рамках процедур.
Между LEVEL
существуют некоторые заметные различия и
MAXLEVEL
. Значение LEVEL
зависит от контекста, а именно, происходит ли оценка на интерактивном уровне или в процедуре. Кроме того, некоторые системные функции, такие как context
и level
, не уважайте текущее значение LEVEL
. В отличие от этого MAXLEVEL
связанная глобальная переменная. Это работает как последнее прибежище когда управление оценки через LEVEL
сбои.
Значение по умолчанию MAXLEVEL
100
; MAXLEVEL
имеет это значение после запуска или сброса системы через reset
. Также команда delete MAXLEVEL
восстанавливает значение по умолчанию.
MAXLEVEL
глобальная переменная. Используйте оператор save MAXLEVEL
в процедуре, чтобы ограничить любые изменения в MAXLEVEL
к этой процедуре.
Максимальное значение MAXLEVEL
зависит от операционной системы. Под Windows® это 213 = 8192. Под операционными системами UNIX® максимальное значение зависит от максимального размера C-стека. С размером стека по умолчанию 8 MB
значение 8192, также; с большим размером стека это может быть больше (в ударе, размер стека может быть установлен с ulimit -s
).
Оценка объектов, заданных бесконечной рекурсией, производит ошибку:
delete a: a := a + 1: a
Error: Recursive definition: Reached maximal evaluation level.
Это также работает на взаимно рекурсивные определения:
delete a, b: a := b^2: b := a + 1: b
Error: Recursive definition: Reached maximal evaluation level.
Если MAXLEVEL
меньше или равен LEVEL
, как значение по умолчанию на интерактивном уровне, затем возражает, оценены полностью до глубины MAXLEVEL-1
, и ошибка происходит если глубина замены MAXLEVEL
достигнут, включено ли рекурсивное определение или нет:
delete a, b, c, d: a := b: b := c: c := 7: d := d + 1: MAXLEVEL := 2: LEVEL := 2: c
a
Error: Recursive definition: Reached maximal evaluation level.
d
Error: Recursive definition: Reached maximal evaluation level.
С другой стороны, MAXLEVEL
не оказывает влияния, если это превышает LEVEL
. Затем любой объект оценен до глубины в большей части LEVEL
, и “рекурсивное определение” ошибка не происходит:
MAXLEVEL := 3: a, b, c, d
В частности, MAXLEVEL
обычно не оказывает влияния в рамках процедур, где LEVEL
по умолчанию имеет значение 1:
MAXLEVEL := 2: p := proc() begin a, d end_proc: p(); delete MAXLEVEL, LEVEL: