eval
Оцените объект
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
eval(object
)
eval(object)
оценивает его аргумент object
рекурсивно заменяя идентификаторы, происходящие в нем их значениями и выполняющие вызовы функции, и затем, оценивает результат снова.
eval
подачи, чтобы запросить оценку неоцененных или частично оцененных объектов. Оценка означает, что идентификаторы заменяются их значениями, и вызовы функции выполняются.
Обычно, каждая системная функция автоматически оценивает свои аргументы и возвращает полностью оцененный объект и использование eval
только необходимо в исключительных случаях. Например, функции map
op
, и subs
может возвратить объекты, которые не полностью оценены. Смотрите Пример 1.
Как большинство других функций MuPAD®, eval
сначала оценивает его аргумент. Затем это оценивает результат снова. На интерактивном уровне вторая оценка обычно не оказывает влияния, но это отличается в рамках процедур. Смотрите Пример 3 и Пример 4.
eval
чувствительно к значению переменной окружения LEVEL
, который определяет максимальную глубину рекурсивного процесса, который заменяет идентификатор его значением во время оценки. Оценка аргумента и последующая оценка результата оба происходят с глубиной замены LEVEL
. Смотрите пример 3.
Если локальная переменная или формальный параметр, типа DOM_VAR
, из procedure
происходит в object
, затем это всегда заменяется его значением когда eval
оценивает его аргумент, независимый от значения LEVEL
. При последующей второй оценке значение локальной переменной оценено с глубиной замены, данной LEVEL
, который обычно является 1
. См. пример 4.
Поведение eval
в рамках процедуры может не иногда быть тем, что вы ожидаете, поскольку глубиной замены по умолчанию в рамках процедур является 1
и eval
оценивает с этой глубиной замены. Используйте level
запрашивать полную оценку в рамках процедуры; смотрите соответствующую страницу справки для деталей.
eval
осуществляет оценку выражений формы hold(x)
: eval(hold(x))
эквивалентно x
. См. пример 2.
eval
принимает последовательности выражения как аргументы. Смотрите Пример 3. В частности, вызов eval()
возвращает пустую последовательность null()
.
eval
рекурсивно не убывает в arrays
. Используйте вызов map(object, eval)
оценивать записи массива. См. Пример 5.
eval
рекурсивно не убывает в tables
. Используйте вызов map(object, eval)
оценивать записи таблицы.
Однако не возможно оценить индексы данной таблицы. Если вы хотите сделать это, составьте новую таблицу с оцененными операндами старого. См. Пример 6.
Polynomials
далее не оценены eval
. Используйте evalp
заменять значениями indeterminates полинома и использовать вызов mapcoeffs(object, eval)
оценивать все коэффициенты. См. Пример 7.
Оценка элементов пользовательской области зависит от реализации области. Обычно, доменные элементы остаются неоцененными. Если область имеет паз "evaluate"
, соответствующая стандартная программа паза вызвана доменным элементом в качестве аргумента при каждой оценке, и следовательно это называется дважды когда eval
вызывается. См. Пример 8.
eval
чувствительно к значению переменной окружения LEVEL
, который определяет максимальную глубину замены для идентификаторов.
subs
выполняет замену, но не оценивает результат:
subs(ln(x), x = 1)
Явный вызов eval
необходимо, чтобы оценить результат:
eval(subs(ln(x), x = 1))
text2expr
не оценивает его результат также:
a := c: text2expr("a + a"), eval(text2expr("a + a"))
Функциональный hold
предотвращает оценку его аргумента. Более поздняя оценка может быть обеспечена с eval
:
hold(1 + 1); eval(%)
Когда объект оценен, идентификаторы заменяются их значениями рекурсивно. Максимальная глубина рекурсии этого процесса дана переменной окружения LEVEL
:
delete a0, a1, a2, a3, a4: a0 := a1: a1 := a2 + 2: a2 := a3 + a4: a3 := a4^2: a4 := 5:
LEVEL := 1: a0, a0 + a2; LEVEL := 2: a0, a0 + a2; LEVEL := 3: a0, a0 + a2; LEVEL := 4: a0, a0 + a2; LEVEL := 5: a0, a0 + a2;
eval
сначала оценивает его аргумент и затем оценивает результат снова. Обе оценки происходят с глубиной замены, данной LEVEL
:
LEVEL := 1: eval(a0, a0 + a2); LEVEL := 2: eval(a0, a0 + a2); LEVEL := 3: eval(a0, a0 + a2);
Начиная со значения по умолчанию LEVEL
100
eval
обычно не оказывает влияния на интерактивном уровне:
delete LEVEL: a0, eval(a0), a0 + a2, eval(a0 + a2)
Этот пример показывает различие между оценкой идентификаторов и локальными переменными. По умолчанию, значение LEVEL
1
в рамках процедуры, т.е. глобального идентификатора заменяется его значением, когда оценено, но нет никакой дальнейшей рекурсивной оценки. Это изменяется когда LEVEL
присвоен большее значение в процедуре:
delete a0, a1, a2, a3: a0 := a1 + a2: a1 := a2 + a3: a2 := a3^2 - 1: a3 := 5: p := proc() save LEVEL; begin print(a0, eval(a0)): LEVEL := 2: print(a0, eval(a0)): end_proc:
p()
В отличие от этого оценка локальной переменной заменяет его своим значением без дальнейшей оценки. Когда eval
применяется к объекту, содержащему локальную переменную, затем эффект является оценкой значения локальной переменной с глубиной замены LEVEL
:
q := proc() save LEVEL; local x; begin x := a0: print(x, eval(x)): LEVEL := 2: print(x, eval(x)): end_proc: q()
Команда x:=a0
присваивает значение идентификатора a0
, а именно, неоцененное выражение a1+a2
, к локальной переменной x
, и x
заменяется этим значением каждый раз, когда оно оценено, независимо от значения LEVEL
:
В отличие от списков и наборов, оценка массива не оценивает свои записи. Таким образом eval
не оказывает влияния для массивов также. Используйте map
оценивать все записи массива:
delete a, b: L := [a, b]: A := array(1..2, L): a := 1: b := 2: L, A, eval(A), map(A, eval)
Вызов map(A, gamma)
не оценивает записи массива A
прежде, чем применить функциональный gamma
. Сопоставьте функциональный gamma@eval
осуществлять оценку:
map(A, gamma), map(A, gamma@eval)
Точно так же оценка таблицы не оценивает свои записи, и можно использовать map
достигнуть этого. Однако это не влияет на индексы:
delete a, b: T := table(a = b): a := 1: b := 2: T, eval(T), map(T, eval)
Если вы хотите таблицу с оцененными индексами также, составляете новую таблицу от оцененных операндов старой таблицы. Используя eval
необходимо здесь начиная с функции операнда op
не оценивает возвращенные операнды:
op(T), table(eval(op(T)))
Polynomials
инертны, когда оценено, и также eval
не оказывает влияния:
delete a, x: p := poly(a*x, [x]): a := 2: x := 3: p, eval(p), map(p, eval)
Используйте mapcoeffs
оценивать все коэффициенты:
mapcoeffs(p, eval)
Если вы хотите заменить значением неопределенный x
, используйте evalp
:
delete x: evalp(p, x = 3)
Как вы видите, результат evalp
вызов может содержать неоцененные идентификаторы, и можно оценить их приложением eval
:
eval(evalp(p, x = 3))
Оценка элемента пользовательские области зависит от реализации области. Обычно, это не оценено далее:
delete a: T := newDomain("T"): e := new(T, a): a := 1: e, eval(e), map(e, eval), val(e)
Если паз "evaluate"
существует, соответствующая стандартная программа паза называется для доменного элемента каждый раз, когда она оценена. Мы реализуем стандартный T::evaluate
, который просто оценивает все внутренние операнды его аргумента для нашего доменного T
. К неоцененному доменному элементу можно все еще получить доступ через val
:
T::evaluate := x -> new(T, eval(extop(x))): e, eval(e), map(e, eval), val(e)
|
Любой объект MuPAD |
Объект Evaluated.