Оцените объект с заданной глубиной замены
Блокноты 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)
объект
оценен без замены любого идентификатора, происходящего в нем его значением. В большинстве случаев, но не всегда, этот эквивалент 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
Таблицы
, 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
вызывается. См. Пример 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.