Оцените объект с заданной глубиной замены
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
level(object
) level(object
,n
)
level(object, n)
оценивает object
с глубиной замены n
.
Когда объект MuPAD® оценен, идентификаторы, происходящие в нем, заменяются их значениями. Это происходит рекурсивно, т.е. если сами значения содержат идентификаторы, то они заменяются также. level
служит, чтобы оценить объект с заданной глубиной рекурсии для этого процесса замены.
С level(object, 0)
object
оценен без замены любого идентификатора, происходящего в нем его значением. В большинстве случаев, но не всегда, этот эквивалент hold(object)
и object
возвращены неоцененные. Смотрите Пример 3.
С level(object, 1)
все идентификаторы, происходящие в object
, заменяются их значениями, но не рекурсивно, и затем все вызовы функции в результате замены выполняются. Это - то, как объекты оценены в рамках процедуры по умолчанию.
Вызов level(object)
эквивалентен level(object, MAXLEVEL)
, т.е. идентификаторам, происходящим в object
, рекурсивно заменяется их значениями до глубины замены MAXLEVEL - 1
, и ошибка происходит, если глубина замены MAXLEVEL
достигнута. Обычно, это приводит к полной оценке object
. Смотрите Пример 1.
Можно использовать level
без второго аргумента, чтобы запросить полную оценку объекта, не содержащего локальные переменные или формальные параметры в рамках процедуры. Это может быть необходимо, поскольку по умолчанию, объекты оценены с глубиной замены 1
в рамках процедур. Смотрите Пример 2.
В противном случае никогда не должно быть необходимо использовать level
.
level
не влияет на оценку локальных переменных и формальных параметров, типа DOM_VAR
, в процедурах. Когда такая локальная переменная происходит в object
, затем это всегда заменяется его значением, независимым от значения n
, и значение далее рекурсивно не оценено. Смотрите Пример 2.
level
работает путем временного устанавливания значения LEVEL
к n
, или к 231 - 1, если n
не дан. Однако значение MAXLEVEL
остается неизменным. Если глубина замены, MAXLEVEL
достигнут, то сообщение об ошибке возвращено. Смотрите LEVEL
и MAXLEVEL
для получения дополнительной информации об этих переменных окружения.
В отличие от большинства других функций, level
не сглаживает свой первый аргумент, если это - последовательность выражения. Смотрите Пример 5.
level
рекурсивно не убывает в arrays
, tables
, matrices
или polynomials
. Используйте вызов map(object, eval)
, чтобы оценить записи массива, таблицы, матрицы или mapcoeffs(object, eval)
, чтобы оценить коэффициенты полинома. Смотрите Пример 4 и Пример 6.
Дополнительная информация относительно оценки массивов, таблиц, матриц или полиномов может быть найдена на странице справки eval
.
Максимальная глубина замены level
зависит от переменной окружения MAXLEVEL
, в то время как максимальная глубина оценки функционального eval
зависит от переменной окружения LEVEL
. Смотрите Пример 7.
Поскольку eval
оценивает результат снова существует различие между выполнением выражения с глубиной n level
по сравнению с eval
. Смотрите Пример 7.
Когда упомянутый level
не влияет на оценку локальных переменных и формальных параметров, типа DOM_VAR
, в процедурах. Здесь eval
ведет себя отличающийся. Смотрите Пример 7 и страница справки eval
для получения дополнительной информации.
Результатом level(hold(x))
всегда является x
, потому что полная оценка hold(x)
приводит к x
. То же самое не содержит для eval(hold(x))
, потому что eval
сначала оценивает свой аргумент и затем оценивает результат снова.
Оценка элементов пользовательской области зависит от реализации области. Обычно доменные элементы остаются неоцененными level
. Если область имеет слот "evaluate"
, соответствующая стандартная программа слота вызвана доменным элементом в качестве аргумента при каждой оценке, и следовательно это называется однажды, когда level
вызывается. Cf. Пример 8.
Мы демонстрируем эффект level
для различных значений второго параметра:
delete a0, a1, a2, a3, a4, b: b := b + 1: a0 := a1: a1 := a2 + 2: a2 := a3 + a4: a3 := a4^2: a4 := 5:
hold(a0), hold(a0 + a2), hold(b); level(a0, 0), level(a0 + a2, 0), level(b, 0); level(a0, 1), level(a0 + a2, 1), level(b, 1); level(a0, 2), level(a0 + a2, 2), level(b, 2); level(a0, 3), level(a0 + a2, 3), level(b, 3); level(a0, 4), level(a0 + a2, 4), level(b, 4); level(a0, 5), level(a0 + a2, 5), level(b, 5); level(a0, 6), level(a0 + a2, 6), level(b, 6);
Оценка object
, только введя object
в командной строке эквивалентна level(object, LEVEL)
:
LEVEL := 2: MAXLEVEL := 4: a0, a2, b; level(a0, LEVEL), level(a2, LEVEL), level(b, LEVEL)
Если второй аргумент не использован, то это соответствует полной оценке до глубины замены MAXLEVEL - 1
:
level(a0)
Error: Recursive definition: Reached maximal evaluation level.
level(a2)
level(b)
Error: Recursive definition: Reached maximal evaluation level.
delete LEVEL, MAXLEVEL:
Мы демонстрируем поведение level
в процедурах:
delete a, b, c: a := b: b := c: c := 42: p := proc() local x; begin x := a: print(level(x, 0), x, level(x, 2), level(x)): print(level(a, 0), a, level(a, 2), level(a)): end_proc: p()
Поскольку a
оценен с глубиной замены по умолчанию 1
, присвоение, x:=a
устанавливает значение локальной переменной x
к неоцененному идентификатору b
. Вы видите, что любая оценка x
, используется ли level
или нет, просто заменяет x
своим значением, b
, но никакая дальнейшая рекурсивная оценка происходит. Напротив, оценка идентификатора, a
происходит с глубиной замены по умолчанию 1
и level(a, 2)
, оценивает его с глубиной замены 2
.
Таким образом level
без второго аргумента может использоваться, чтобы запросить полную оценку объекта, не содержащего локальных переменных или формальных параметров.
Существуют некоторые редкие случаи, где level(object, 0)
и hold(object)
ведут себя отличающиеся. Дело обстоит так, если object
не является идентификатором, например, неназванная функция, потому что level
влияет только на оценку идентификаторов:
level((x -> x^2)(2),0), hold((x -> x^2)(2))
По той же причине level(object, 0)
и hold(object)
ведут себя по-другому, если object
является локальной переменной процедуры:
f:=proc() local x; begin x := 42; hold(x), level(x, 0); end_proc: f(); delete f:
В отличие от списков и наборов, оценка массива не оценивает свои записи. Таким образом level
не имеет никакого эффекта для массивов также. То же самое содержит для таблиц и матриц. Используйте map
, чтобы оценить все записи массива. На странице справки eval
могут быть найдены дальнейшие примеры:
delete a, b: L := [a, b]: A := array(1..2, L): a := 1: b := 2: L, A, level(A), map(A, level), map(A, eval)
Первый аргумент level
может быть последовательностью выражения, которая не сглажена. Однако это должно быть заключено в круглые скобки:
delete a, b: a := b: b := 3: level((a, b), 1); level(a, b, 1)
Error: Invalid number of arguments. [level]
Polynomials
инертен, когда оценено, и таким образом, level
не имеет никакого эффекта:
delete a, x: p := poly(a*x, [x]): a := 2: x := 3: p, level(p)
Используйте mapcoeffs
и функциональный eval
, чтобы оценить все коэффициенты:
mapcoeffs(p, eval)
Если вы хотите заменить значением неопределенный x
, используйте evalp
:
delete x: evalp(p, x = 3)
Как вы видите, результат вызова evalp
может содержать неоцененные идентификаторы, и можно оценить их приложением eval
. Необходимо использовать eval
вместо level
, потому что level
не оценивает свой результат:
eval(evalp(p, x = 3))
Тонкое различие между level
и eval
показывают. Глубина оценки eval
ограничивается переменной окружения LEVEL
. level
не уделяет внимания LEVEL
, а скорее продолжает оценивать свой аргумент или так много раз, как второй аргумент подразумевает или пока это не было оценено полностью:
delete a0, a1, a2, a3: a0 := a1 + a2: a1 := a2 + a3: a2 := a3^2 - 1: a3 := 5: LEVEL := 1: eval(a0), level(a0);
Если глубина оценки превышает значение MAXLEVEL
, ошибка повышена в обоих случаях:
delete LEVEL: MAXLEVEL := 3: level(a0);
Error: Recursive definition: Reached maximal evaluation level.
delete LEVEL: MAXLEVEL := 3: eval(a0); delete MAXLEVEL:
Error: Recursive definition: Reached maximal evaluation level.
Это не то же самое, выполняющее выражение ex
с eval
и глубиной оценки n и level((ex, n))
, потому что eval
оценивает свой результат:
LEVEL := 2: eval(a0), level(a0, 2); delete LEVEL:
level
не влияет на оценку локальных переменных типа DOM_VAR
, в то время как eval
оценивает их с глубиной оценки LEVEL
, который является один в процедуре:
p := proc() local x; begin x := a0: print(eval(x), level(x)): end_proc: p()
Оценка элемента пользовательской области зависит от реализации области. Обычно это далее не оценено:
delete a: T := newDomain("T"): e := new(T, a): a := 1: e, level(e), map(e, level), val(e)
Если слот "evaluate"
существует, соответствующая стандартная программа слота называется для доменного элемента каждый раз, когда это оценено. Мы реализуем стандартный T::evaluate
, который просто оценивает все внутренние операнды его аргумента для нашего доменного T
. К неоцененному доменному элементу можно все еще получить доступ через val
:
T::evaluate := x -> new(T, eval(extop(x))): e, level(e), map(e, level), val(e);
delete e, T:
|
Любой объект MuPAD |
|
Неотрицательное целое число меньше чем 231 |
Объект Evaluated.