context
Оцените объект в контексте включения
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
context(object
)
В рамках процедуры context(object)
оценивает object
в контексте процедуры вызова.
Процедуры Most MuPAD® оценивают свои аргументы прежде, чем выполнить тело процедуры. Однако, если процедура объявляется с опцией hold
, то аргументы передаются неоцененной процедуре. context
служит, чтобы оценить такие аргументы по опыту из процедуры.
Как большинство процедур MuPAD, context
сначала оценивает свой аргумент object
, как обычно, в контексте текущей процедуры. Затем результат оценен снова в динамическом контексте, который был допустим, прежде чем текущая процедура была названа. Контекст включения является или интерактивным уровнем или процедурой который названный текущей процедурой.
"func_call"
- методы областей никогда не оценивают свои аргументы, используется ли опция hold
или нет. Смотрите Пример 2.
context
чувствителен к значению переменной окружения LEVEL
, который определяет максимальную глубину рекурсивного процесса, который заменяет идентификатор его значением во время оценки. Оценка аргумента происходит со значением LEVEL
, который допустим в текущей процедуре, которая является 1
по умолчанию. Вторая оценка использует значение LEVEL
, который допустим в контексте включения, который обычно является 1
, если контекст включения является также процедурой, в то время как это - 100
по умолчанию, если контекст включения является интерактивным уровнем. Смотрите Пример 3.
Функциональный context
не должен быть назван на интерактивном уровне, и вызовы context
не должны быть вложены. Таким образом не возможно оценить объект в более высоких уровнях динамического стека вызовов. Смотрите Пример 4.
context
чувствителен к значению переменной окружения LEVEL
, который определяет максимальную глубину замены для идентификаторов.
Мы задаем процедуру f
с опцией hold
. Если эта процедура вызвана идентификатором в качестве аргумента, такого как a
ниже, сам identifier
является действительным аргументом в f
. context
может использоваться, чтобы получить значение a
во внешнем контексте:
a := 2: f := proc(i) option hold; begin print(i, context(i), i^2 + 2, context(i^2 + 2)); end_proc: f(a):
Если процедура с опцией, которой hold
называется из другой процедуры, вы будете видеть странные эффекты, если процедура с опцией hold
не оценивает свои формальные параметры с context
. Здесь, значение формального параметра, j
в g
является i
variable
, который задан в контексте процедуры f
и не его значение 4
. Когда необходимо получить доступ к значению этой переменной необходимо использовать context
, в противном случае вы видите вывод DOM_VAR(0,2)
, который является переменной i
f
, который потерял его осциллограф:
f := proc() local i; begin i := 4: g(i); end_proc: g := proc(j) option hold; begin print(j, eval(j), context(j)); print(j + 1) end_proc: f()
Метод "func_call"
области неявно объявляется с option hold
. Мы задаем метод "func_call"
для доменного DOM_STRING
строк MuPAD. Стандартная программа слота преобразовывает свои остающиеся аргументы в строки и добавляет их к первому аргументу, который совпадает со строкой, которая является 0th операндом вызова функции:
unprotect(DOM_STRING): DOM_STRING::func_call := string -> _concat(string, map(args(2..args(0)), expr2text)): a := 1: "abc"(1, a, x)
Вы видите, что идентификатор a
был добавлен к строке, и не ее значению 1
. Используйте context
, чтобы получить доступ к значению, которое имеет a
, прежде чем метод "func_call"
вызывается:
DOM_STRING::func_call := string -> _concat(string, map(context(args(2..args(0))), expr2text)): "abc"(1, a, x); delete DOM_STRING::func_call: protect(DOM_STRING, Error):
Этот пример показывает влияние переменной окружения LEVEL
на оценке context
и различий для функций eval
и level
. p
является функцией с опцией hold
. x
является формальным параметром этой процедуры. При оценке их аргументов context
, eval
и level
вся замена x
сначала его значением a
. Затем eval
оценивает a
в текущем контексте с LEVEL = 1
и приводит к значению b
. context
оценивает a
в контексте включения (который является интерактивным уровнем) с LEVEL = 100
, и приводит к c
. level
всегда возвращает результат первого шага оценки, который является a
.
Когда LEVEL
интерактивного уровня является 1
, context
возвращает b
как eval
, поскольку вторая оценка выполняется с LEVEL = 1
как в eval
.
b
локальной переменной p
не влияет на оценку в context
, eval
и level
, поскольку это - только локально заявленная переменная типа DOM_VAR
, который не имеет никакого отношения к идентификатору b
, который является значением a
:
delete a, b, c: a := b: b := c: p := proc(x) option hold; local b; begin b := 2; eval(x), context(x), level(x), level(x,2); end: p(a); LEVEL := 1: p(a); delete LEVEL:
Функциональный context
не должен быть назван на интерактивном уровне:
context(x)
Error: Function call not supported on interactive level. [context]
Error: Function call not allowed on interactive level. [context]
|
Любой объект MuPAD |
Объект Evaluated.