是否有像Octave和Scilab的预处理器指令用于互相兼容的代码?

问题描述 投票:1回答:2

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

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

P.S.1不同的方法是:

  1. 有传统的if then elseif else end语句,包括不同解释器的有效语法,具有独特的结果。如下面的答案所示。
  2. 使用来自Scilab方面的getsexecexecstr来加载.m文件。可以使用一些正则表达式来清理代码。 Octave确实有像#<include>...</include>这样的xml
  3. 有一个量身定制的import函数,如this one,用于将MATLAB代码导入Octave

P.S.2 Octave具有version()功能,Scilab / ScicosLab具有getversion(),Julia具有versioninfoVERSIONFreeMat也具有version功能。也许这也可以用。

P.3.3已有Matlab/Octave Compatibility toolbox用于scilab。还有Sci cosim使用TCP端口将变量从Scilab工作空间导入Octave。

octave scilab preprocessor-directive transpiler mixed-programming
2个回答
3
投票

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

在像matlab,scilab和octave这样的解释语言中,这种事情是多余的。因此,执行足以区分三种环境的测试的简单“if / else”块应该是足够的。

八度手册suggests a way to distinguish between octave and matlab不会带来严重的性能损失。我没有安装scilab来提供等效的测试,但我确信scilab也有一个简单的测试。

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

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

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


1
投票

你可以定义一个函数isscilab

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.