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
. Cf. Пример 4.
Поведение eval
в рамках процедуры не может иногда быть тем, что вы ожидаете, поскольку глубиной замены по умолчанию в рамках процедур является 1
, и eval
оценивает с этой глубиной замены. Используйте level
, чтобы запросить полную оценку в рамках процедуры; смотрите соответствующую страницу справки для деталей.
eval
осуществляет оценку выражений формы hold(x)
: eval(hold(x))
эквивалентен x
. Cf. Пример 2.
eval
принимает последовательности выражения как аргументы. Смотрите Пример 3. В частности, вызов eval()
возвращает пустую последовательность null()
.
eval
рекурсивно не убывает в arrays
. Используйте вызов map(object, eval)
, чтобы оценить записи массива. Cf. Пример 5.
eval
рекурсивно не убывает в tables
. Используйте вызов map(object, eval)
, чтобы оценить записи таблицы.
Однако не возможно оценить индексы данной таблицы. Если вы хотите сделать это, составьте новую таблицу с оцененными операндами старого. Cf. Пример 6.
Polynomials
далее не оценен eval
. Используйте evalp
, чтобы заменить значениями indeterminates полинома и использовать вызов mapcoeffs(object, eval)
, чтобы оценить все коэффициенты. Cf. Пример 7.
Оценка элементов пользовательской области зависит от реализации области. Обычно, доменные элементы остаются неоцененными. Если область имеет слот "evaluate"
, соответствующая стандартная программа слота вызвана доменным элементом в качестве аргумента при каждой оценке, и следовательно это называется дважды, когда eval
вызывается. Cf. Пример 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.