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: