Оцените объект с заданной глубиной замены
Блокноты 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.