Sue*_*ver 3 matlab overloading function octave
我正在尝试在Octave中重载某些内置函数,以在调用重载函数的内置版本之前执行自定义操作。在MATLAB(据称是Octave)中,我可以使用builtin函数进行此操作。
典型的函数定义如下所示:在执行自定义操作后,我将所有输入/输出转发到内置设备/从内置设备转发:
function varargout = disp(varargin)
% Do a custom thing
fprintf('Calling overloaded disp!\n')
% Now call the builtin
[varargout{1:nargout}] = builtin('disp', varargin{:});
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我将此文件(disp.m)放在路径上,则任何调用的函数都disp将执行我的重载版本,该版本将在调用内置disp函数之前打印出更多信息。
>> disp('hello world')
Calling overloaded disp!
hello world
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,这适用于某些内置组件,但不是全部。例如,如果我尝试重载figure。
function varargout = figure(varargin)
disp('Creating a figure!')
[varargout{1:nargout}] = builtin('figure', varargin{:});
end
Run Code Online (Sandbox Code Playgroud)
当我调用此函数时,请再次builtin调用重载函数,而不是真正的内置函数。
>> figure()
Creating a figure!
Creating a figure!
Creating a figure!
...
error: max_recursion_depth exceeded
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我重载figure为命令行功能而不是将其保存在命令行中,figure.m则其行为与我期望的完全相同。
> function varargout = figure(varargin), disp('here'), [varargout{1:nargout}] = builtin('figure', varargin{:}), endfunction
> figure()
here
Run Code Online (Sandbox Code Playgroud)
现在,我在调试时注意到的一件事是,当您具有与内置名称相同的函数时,Octave(显然)会发出警告。如果您查看警告,则对于功能重载有效且不适用于的警告而言,它们略有不同:
警告:function ./disp.m隐藏一个内置函数<-
无效警告:function ./figure.m隐藏一个核心库函数<-不起作用
该文档似乎在核心库函数和内置函数之间没有任何区别,并且的文档中未提及此行为builtin。
有谁知道导致这种现象的原因,并且对如何解决此问题有任何建议?
builtin仅适用于内置函数。正如您已经了解的那样,问题在于内置函数和核心库函数之间的区别。
内置函数内置在Octave解释器本身中。
核心库函数是随Octave分发的函数,包括但不限于内置函数。其他核心库函数包括用八度语言编写的所有函数(m个文件)和动态链接的函数(oct个文件)。这些其他功能不是Octave解释器的一部分,仅因为它们的目录已添加到Octave路径而起作用。
使用which或exist找出函数是否内置:
octave> which disp
'disp' is a built-in function from the file libinterp/corefcn/pr-output.cc
octave> which figure
'figure' is a function from the file /home/carandraug/.local/share/octave/4.1.0+/m/plot/util/figure.m
octave> which audioread
'audioread' is a function from the file /home/carandraug/.local/lib/octave/4.1.0+/oct/x86_64-pc-linux-gnu/audioread.oct
octave> exist ("disp", "builtin")
ans = 5
octave> exist ("figure", "builtin")
ans = 0
octave> exist ("audioread", "builtin")
ans = 0
Run Code Online (Sandbox Code Playgroud)
当然,不能保证某个函数在版本之间仍将是内置函数或m文件函数(尽管事实是这种情况很少更改)。
请注意,逻辑在Matlab中是相同的,但是内置函数集会有所不同。
现在我不明白的是,为什么builtin在八度提示下表现不同。与此无关,您只需在.octaverc以下位置定义阴影函数:
$ tail -n 5 ~/.octaverc
function varargout = figure (varargin)
mlock ();
disp ("here");
[varargout{1:nargout}] = builtin ("figure", varargin{:});
endfunction
$ octave
octave> figure
here
Run Code Online (Sandbox Code Playgroud)