9.2不同背景下的评估

在计算表达式之前,需要替换表达式中使用的变量的值。这些存储在符号表中。每当解释器启动一个新函数时,它都会保存当前符号表并创建一个新的符号表,并使用函数参数列表和几个预定义的变量对其进行初始化,例如nargin。函数内的表达式使用新的符号表。

有时你想写一个函数,这样当你调用它时,它会在你自己的上下文中修改变量。这允许您使用按名称传递的函数样式,这类似于在C等编程语言中使用指针。

考虑一下你可能会如何写作saveloadasm文件。例如

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

在这里callercreate_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

在这里callerprocess_data作用

您可以在命令提示符下使用上下文设置和使用变量base而不是caller’.

这些函数在实践中很少使用。一个例子是fail (‘code’, ‘pattern’)计算的函数code,并检查它生成的错误消息是否与给定的模式匹配。其他示例,例如saveload用C++编写,其中所有Octave变量都在caller上下文和evalin不需要。

 
: evalin (context, try)
: evalin (context, try, catch)

喜欢eval,但表达式是在上下文中计算的context,可以是"caller""base".

详见: eval, assignin.

广告
 
: assignin (context, varname, value)

赋值valuevarname在上下文中context,可以是"base""caller".

详见: evalin.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2