9.2 Вычисление в другом контексте
Прежде чем вычислить выражение, необходимо подставить значения переменных, используемых в выражении. Они хранятся в таблице символов. Каждый раз, когда интерпретатор запускает новую функцию, он сохраняет текущую таблицу символов и создает новую, инициализируя ее списком параметров функции и парой предопределенных переменных, таких как nargin. В выражениях внутри функции используется новая таблица символов.
Иногда требуется написать функцию так, чтобы при вызове она изменяла переменные в вашем контексте. Это позволяет использовать передачу аргументов по имени, что похоже на использование указателя в таких языках программирования, как C.
Рассмотрим, как можно написать save и load в виде m-файлов. Например:
function create_data x = linspace (0, 10, 10); y = sin (x); save mydata x y endfunction
С помощью evalin можно написать save следующим образом:
function save (file, name1, name2)
f = open_save_file (file);
save_var (f, name1, evalin ("caller", name1));
save_var (f, name2, evalin ("caller", name2));
endfunction Здесь «caller» — это функция create_data, а name1 — строка "x", которая вычисляется просто как значение x.
Позже вы захотите загрузить значения из mydata в другом контексте:
function process_data load mydata ... do work ... endfunction
С помощью assignin можно написать load следующим образом:
function load (file)
f = open_load_file (file);
[name, val] = load_var (f);
assignin ("caller", name, val);
[name, val] = load_var (f);
assignin ("caller", name, val);
endfunction Здесь «caller» — это функция process_data.
Вы можете задавать и использовать переменные в командной строке, используя контекст «base», а не «caller».
На практике эти функции используются редко. Один из примеров — функция fail (‘code’, ‘pattern’), которая вычисляет «code» в контексте вызывающей функции и проверяет, соответствует ли выданное сообщение об ошибке заданному шаблону. Другие примеры, такие как save и load, написаны на C++, где все переменные Octave находятся в контексте «caller», поэтому evalin не требуется.
-
: evalin
(context, try) -
: evalin
(context, try, catch) -
Аналогично
eval, но выражения вычисляются в контексте context, которым может быть"caller"или"base".
-
: assignin
(context, varname, value) -
Присваивает value переменной varname в контексте context, которым может быть
"base"или"caller".См. также: evalin.
© 1996–2026 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.4.0/Evaluation-in-a-Different-Context.html