уровень

Оцените объект с заданной глубиной замены

Блокноты 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.

Примеры

Пример 1

Мы демонстрируем эффект 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:

Пример 2

Мы демонстрируем поведение 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 без второго аргумента может использоваться, чтобы запросить полную оценку объекта, не содержащего локальных переменных или формальных параметров.

Пример 3

Существуют некоторые редкие случаи, где 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:

Пример 4

В отличие от списков и наборов, оценка массива не оценивает свои записи. Таким образом 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)

Пример 5

Первый аргумент level может быть последовательностью выражения, которая не сглажена. Однако это должно быть заключено в круглые скобки:

delete a, b: a := b: b := 3:
level((a, b), 1);
level(a, b, 1)

Error: Invalid number of arguments. [level]

Пример 6

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))

Пример 7

Тонкое различие между 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()

Пример 8

Оценка элемента пользовательской области зависит от реализации области. Обычно это далее не оценено:

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:

Параметры

object

Любой объект MuPAD

n

Неотрицательное целое число меньше чем 231

Возвращаемые значения

Объект Evaluated.

Смотрите также

Функции MuPAD

Для просмотра документации необходимо авторизоваться на сайте