1

在 C / C++ 语言中,可以使用宏或所谓的“每处理器指令”来指示编译器应如何读取代码。#def, #ifdef, #ifndef, #else, ...的简单命令#endif使编译器能够检查操作系统、编译器和其他环境信息。我知道 Octave 和 Scilab 是解释性语言,但我想知道是否有任何方法可以告诉解释器在加载脚本时替换部分脚本?例如,我可以编写一个基于 Scilab 语法注释的代码,//然后指示解释器将它们作为 Octave 的注释语法读取为#or%吗?这似乎是 Scilab Octave 间兼容性的主要问题之一。

如果有一种方法可以指示口译员检查口译员的信息 Scilab/ScicoLab/Octave/FreeMat,Julia... 和版本... 然后根据这些信息有一些#ifdef #endif块... 然后可以写与上述多个解释器兼容的代码。如果您能告诉我加载时间指令是否可行,我将不胜感激,如果不可行,是否/如何编写与 Octave 和 Scilab 兼容的代码?

PS1不同的方法是:

  1. 具有常规if then elseif else end语句,包括跨不同解释器的有效语法并具有独特的结果。正如以下答案中所建议的那样。
  2. 使用gets, exec,execstr从 Scilab 端加载.m文件。可以做一些正则表达式来清理代码。Octave 确实有类似的 xml#<include>...</include>
  3. 有一个像这样的定制import功能,用于将 MATLAB 代码导入 Octave

PS2 Octave 有version()功能,Scilab /ScicosLab 有getversion(),Julia 有versioninfoand VERSIONFreeMat也有version功能。也许也可以使用。

PS3已经有scilab 的Matlab/Octave 兼容性工具箱。还有Sci cosim可以使用 TCP 端口将变量从 Scilab 工作区导入 Octave。

4

2 回答 2

3

我想换个角度回答。也就是说,如果您觉得需要比较预处理器指令,您可能会认为 scilab 和 octave 都错了。在 C 和 C++ 中需要预处理指令的原因是因为它们是编译语言。在编译发生之前,预处理器指令对将要编译的实际代码进行更改。

在 matlab、scilab 和 octave 这样的解释型语言中,这种事情是多余的。因此,一个简单的“if / else”块执行充分区分三种环境的测试就足够了。

octave 手册建议了一种区分 octave 和 matlab 的方法,该方法不会带来严重的性能损失。我没有安装 scilab 来提供等效测试,但我确信 scilab 也存在一个简单的测试。

因此,在通过检测正确的环境来运行不同代码的情况下,这是完全可能的。

在模仿#include 策略的上下文中,由于脚本是按顺序运行的,因此您可以实现一个“if / else”块,它只是在正确的时间运行不同的基本脚本。

PS。Matlab 一直在对脚本的解释方式进行一些更改,因此如果执行“嵌套”错误检查而不是表面错误检查,这可能会导致问题。但是,即使确实发生了这种情况,您也可以使用run filename语法来代替直接调用脚本,或者在更糟糕的情况下,使用eval来调用脚本。

于 2019-03-12T14:17:20.633 回答
1

您可以定义一个函数isscilab

function [out] = isscilab()
        out = length(zeros(2)) == 1;
endfunction

并使用它有条件地执行代码:

if isscilab()
    do scilab...
else
    do octave...
end

但我认为最好的选择是你应该为 Octave .m 和 Scilab .sce 实现不同的文件并执行你想要的每一个。

于 2019-03-12T08:09:16.250 回答