在 Octave 中重载内置函数时内置函数的行为不一致

2023-12-29

我试图重载 Octave 中的一些内置函数,以便在调用重载函数的内置版本之前执行自定义操作。在 MATLAB(以及据说是 Octave)中,我可以使用builtin https://www.gnu.org/software/octave/doc/v4.0.1/Overloading-and-Autoloading.html功能。

典型的函数定义如下所示,在执行自定义操作后,我将所有输入/输出转发到内置函数或从内置函数转发所有输入/输出:

function varargout = disp(varargin)
    % Do a custom thing
    fprintf('Calling overloaded disp!\n')

    % Now call the builtin
    [varargout{1:nargout}] = builtin('disp', varargin{:});
end

现在如果我放置这个文件(disp.m)在我的路径上,任何调用的函数disp将执行我的重载版本,该版本在调用内置函数之前打印出额外的信息disp功能。

>> disp('hello world')
Calling overloaded disp!
hello world

我遇到的问题是这适用于some内置但不是全部。例如,如果我尝试超载figure.

function varargout = figure(varargin)
    disp('Creating a figure!')

    [varargout{1:nargout}] = builtin('figure', varargin{:});
end

当我调用这个的时候,builtin称为再次重载函数而不是真正的内置。

>> figure()
Creating a figure!
Creating a figure!
Creating a figure!
...
error: max_recursion_depth exceeded

有趣的是,如果我超载figure作为命令行函数而不是将其保存在figure.m它的行为完全符合我的预期。

> function varargout = figure(varargin), disp('here'), [varargout{1:nargout}] = builtin('figure', varargin{:}), endfunction
> figure()
here

现在,我在调试时注意到的一件事是,当您有一个与内置函数同名的函数时,Octave(显然)会发出警告。如果您查看警告,您会发现对于函数重载有效和无效的警告,它们略有不同:

警告:函数 ./disp.m 隐藏了内置函数 警告:函数 ./figure.m 隐藏了核心库函数

该文档似乎没有对核心库函数和内置函数进行任何区分,并且文档中没有提到此行为builtin.

有谁知道导致此行为的原因,并对如何解决此问题有任何建议?


builtin仅适用于内置函数。正如您已经了解的,问题在于内置函数和核心库函数之间的区别。

内置函数内置于 Octave 解释器本身。

核心库函数是随 Octave 一起分发的函数,包括但不限于内置函数。其他核心库函数包括所有用Octave语言编写的函数(m文件)和动态链接函数(oct文件)。这些其他函数不是 Octave 解释器的一部分,只有在它们的目录被添加到 Octave 路径中时才起作用。

Use which or 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

当然,不能保证某个函数在不同版本之间仍然是内置函数或 m 文件函数(尽管现实情况是这种情况很少发生变化)。

请注意,Matlab 中的逻辑是相同的,但内置函数集会有所不同。

现在我不明白的是为什么builtin在 Octave 提示符下的行为有所不同。与此无关,您可以在以下位置定义您的影子函数:.octaverc:

$ tail -n 5 ~/.octaverc 
function varargout = figure (varargin)
  mlock ();
  disp ("here");
  [varargout{1:nargout}] = builtin ("figure", varargin{:});
endfunction
$ octave
octave> figure
here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Octave 中重载内置函数时内置函数的行为不一致 的相关文章

  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起
  • 八度全局变量

    global m 1 function p h m end h 我正在尝试运行此脚本 但出现此错误 m 在第 4 行第 3 列附近未定义 请告诉我 如何使用函数中的变量 您必须在函数内将 var 声明为全局变量 如下所述 https www
  • 如何在Matlab中将图像从笛卡尔坐标更改为极坐标?

    我正在尝试将图像的像素从 x y 坐标转换为极坐标 但我遇到了问题 因为我想自己编写该函数 这是我到目前为止所做的代码 function newImage PolarCartRot read and show the image image
  • 如何在函数内 malloc 结构体数组?代码以其他方式工作

    我正在尝试创建一个函数来创建可变大小的二维函数数组 我正在使用以下代码 它本身似乎工作得很好 typedef struct Starter Properties int TypeB int TypeF int TypeW Randomize
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 使用 typename 参数时,模板参数推导/替换失败

    我有以下代码 它定义了一个模板结构W导出一个类型T这是基于模板参数W include
  • “重载”在子类中如何工作?

    我有一个基类和一个子类 它们都有相同的属性 但我不明白whyVB 希望我对子类中的属性使用 重载 区别在于该属性的子类版本是Shared而父类基本上是为了结构 这些属性如下所示 Public MustInherit Class Parent
  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • MATLAB 子图标题和轴标签

    我有以下脚本来最终绘制 4 x 2 子图 files getAllFiles preliminaries n size files cases cell 1 n m cell 1 n for i 1 1 n S load files i c
  • 使用网络计算机进行 Matlab 并行处理

    我熟悉matlabpool and parfor用法 但我仍然需要加快计算速度 我的 1GB 网络中有一台功能更强大的计算机 两台计算机都有 R2010b 并且具有相同的代码和路径 使用两台计算机进行并行计算的最简单方法是什么 我今天使用的
  • MATLAB 问题中的 Parfor

    为什么我不能使用parfor在这段代码中 parfor i 1 r for j 1 N r xr j N r i 1 x i r j 1 end end 这是错误 错误 parfor 中的变量 xr 无法分类 请参阅 MATLAB 中的并行
  • 如何调用进行 API 调用的类的实例以及该类中发出请求的函数,并将其分配给变量?迅速

    这是以下问题的后续 为什么代码不在第二个 URLSession shared dataTask 之后 之内执行 即在初始 URLSession shared dataTask 的 do 块内 迅速 https stackoverflow c
  • 当函数参数与c中的const参数声明不匹配时编译的程序

    我有一段这样的代码 include
  • 如何重命名 bash 函数?

    我正在围绕另一个定义 bash 函数的软件包开发一些方便的包装器 我想用我自己的同名函数替换他们的 bash 函数 同时仍然能够从我的函数中运行他们的函数 换句话说 我需要重命名它们的函数 或者为其创建某种持久别名 当我创建同名函数时 该别
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • Matlab的uicontrol在Octave中的实现?

    我正在尝试在 Octave 中运行我们实验室中使用的图形程序的 m Matlab 代码 Octave 告诉我代码中使用的函数 uicontrol 没有定义 经过一番搜索 我发现 JHandles 包有一个 uicontrol GUI 功能的
  • Verilog 中如何使用函数?

    在我的 FPGA Verilog 课程中 我的教授只是回顾了函数 他说在函数中 你可以按程序编写代码 然后 当您想要调用该函数时 您可以在always块中调用它 即 程序性地 也可以使用分配语句来调用它 对我来说 如何使用过程代码编写函数
  • 确定 PHP 到目前为止执行了多长时间

    我需要确定 PHP 函数到目前为止已经运行了多长时间 有哪些选项可以确定某些 PHP 代码的运行时间 我正在使用 zend 框架 Call microtime true 函数以毫秒分辨率获取当前时间
  • 当 MATLAB 变得非常非常忙时,如何中断它?

    我正在运行一个长时间的模拟MATLAB http en wikipedia org wiki MATLAB我意识到我需要停下来重新运行 然而 MATLAB 确实对这种计算很感兴趣 并且它停止了响应 如何在不终止 MATLAB 的情况下中断此

随机推荐

  • Java 8 添加对象列表的多个属性的值

    假设我下面有一个带有 getter 和 setter 的类 但只有默认构造函数 注意 我不允许更改此类的结构 class Target private String year private String month private Str
  • 是否有“好的”PRNG 生成没有隐藏状态的值?

    我需要一些好的伪随机数生成器 它可以像纯函数一样根据之前的输出进行计算 而无需任何状态隐藏 好 我的意思是 我必须能够以运行它的方式参数化生成器2 n任何参数 或其中一些大的子集 的迭代应覆盖之间的所有或几乎所有值0 and 2 n 1 w
  • Oozie Hive 动作挂起,心跳永远

    我试图通过我在 Hue 中创建的 Oozie 工作流程运行 Hive 操作 但该操作永远 心跳 并且不会执行 Hive SQL 我读过其他关于心跳永远的文章 但这篇文章似乎发生在不同的时刻 即在解析 SQL 语句之后 我检查了集群中每个节点
  • JavaScript 异常堆栈跟踪

    在 Firefox 中 我可以通过使用获取异常的堆栈跟踪exception stack 有没有办法在其他浏览器中也获得它 Edit 我实际上想自动保存堆栈跟踪 如果可能 而不是在当时对其进行调试 即我知道如何在调试器中获取堆栈跟踪 将此行放
  • 如何实现利用多个 ViewController 的 UIPageViewController

    我一直在开发一个简单的测试应用程序来了解 UIPageViewController 的细节 我已经让它工作了 但我不相信我的执行是最好的方法 我希望你们中的一些人能给我指出正确的方向 为了获得基本的了解 我使用本教程作为起点 http ww
  • 升级 local::lib 安装的所有模块

    我一直在使用 local lib 来处理服务器上 Perl 模块的安装 这样我就可以获得一些开发工作的正确版本 而不会污染系统安装 然而 系统管理员最近将 Perl 从 5 16 升级到 5 18 我现在收到与二进制模块相关的错误 例如 p
  • OpenShift Next Gen 无法挂载持久卷

    我正在尝试在 OpenShift Online Next Gen 上设置一个应用程序 我需要在运行时存储一个小文件并在启动期间再次读取它 文件的内容发生了变化 因此我不能简单地将其添加到我的源代码中 我的项目已经启动并运行 我所需要的只是持
  • 如何在 python3 和“requests”上发布图像和文本 MultipartForm?

    我正在将代码从 NodeJS 移植到 python3 我想发布图像二进制数据和文本 我该怎么做 谢谢 NodeJS filePath xxx jpeg text xxx return chakram request POST http xx
  • 设计可在 F# 中很好使用的 C# 库的指南

    我只是想指出这个问题并不是相反的 设计供 F 和 C 使用的 F 库的最佳方法 https stackoverflow com questions 10110174 best approach for designing f librari
  • 我应该如何转义 CSV 文件中的逗号和语音标记,以便它们在 Excel 中工作?

    我正在生成一个 CSV 文件 用逗号而不是制表符分隔 我的用户很可能会通过双击在 Excel 中打开 CSV 文件 我的数据可能包含逗号和语音标记 因此我将按如下方式转义这些内容 Reference Title Description 1
  • Android:我应该使用 MimeTypeMap.getFileExtensionFromUrl() 吗? [错误]

    例如 我想使用以下函数从文件 URL 获取文件扩展名 文件名 Greatest Hits Lenny Kravitz Booklet 01 2000 jpg 文件的网址 String url mnt sdcard mydev Greates
  • Python 2.7:打印到文件

    为什么尝试直接打印到文件而不是sys stdout产生以下语法错误 Python 2 7 2 default Oct 4 2011 20 06 09 GCC 4 6 1 on linux2 Type help copyright credi
  • 尝试使用 id==valores0 注册小部件,但该 id 已注册

    我收到此错误 我不知道如何解决 我读这个链接 https stackoverflow com questions 2222517 error tried to register widget with id grid1but that id
  • 以下对于 C 编程中的按位运算意味着什么?

    一本关于 C 编程的书指出 enum corvid magpie raven jay chough corvid num define FLOCK MAGPIE 1 U define FLOCK RAVEN 2 U define FLOCK
  • 检查 Instagram 帐户是公共帐户还是私人帐户

    我看过这个特殊问题 使用 API 查明用户在 Instagram 上是否拥有公共或私人个人资料 https stackoverflow com questions 21101650 find out whether a user has a
  • 随机生成测试数据是一种不好的做法吗?

    自从我开始使用 rspec 以来 我对固定装置的概念产生了疑问 我主要关心的是 我通过测试来揭示令人惊讶的行为 我并不总是足够聪明 无法枚举我正在测试的示例的所有可能的边缘情况 使用硬编码装置似乎有限制 因为它只用我想象的非常具体的情况来测
  • 如何为活动的半透明背景添加圆角?

    我有一个简单的活动 我想要一个圆角矩形形状 该活动使用半透明的 Drawable 我已经看到其他开发人员的弹出窗口是半透明的 不是对话框主题 带有圆角 我正在尝试复制它 任何帮助 将不胜感激 这是我目前拥有的代码 它在屏幕中间生成一个矩形半
  • 如何在 Common Lisp 中重用 gethash 查找?

    我有一个哈希表 其中键是相当复杂的列表 带有符号和整数的子列表 并且应该根据已经存在的值修改该值 该表是用以下命令创建的 test equal 我经常做类似的事情 defun try add i let old i gethash comp
  • 给定一个日期“03/13/2010”,在 MYSQLWhere 子句中使用它?

    我想在以下日期通过 Coldfusion 传递 MYSQL 查询 03 13 2010 因此查询会像这样过滤它 SELECT FROM myTable WHERE dateAdded before or on 03 13 2010 我还希望
  • 在 Octave 中重载内置函数时内置函数的行为不一致

    我试图重载 Octave 中的一些内置函数 以便在调用重载函数的内置版本之前执行自定义操作 在 MATLAB 以及据说是 Octave 中 我可以使用builtin https www gnu org software octave doc