是否存在用于Octave和Scilab的类似于C的预处理器指令用于兼容代码?

时间:2019-03-12 01:38:30

标签: octave scilab preprocessor-directive transpiler mixed-programming

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

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

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

  1. 具有常规的if then elseif else end语句,其中包括跨不同解释器的有效语法,并具有独特的结果。如以下答案中所建议。
  2. 从Scilab端使用getsexecexecstr来加载.m文件。可以做一些正则表达式来清除代码。八度确实具有类似#<include>...</include>
  3. 的xml
  4. 具有定制的import函数,如this one,可以将MATLAB代码导入Octave

PS2 Octave具有version()功能,Scilab / ScicosLab具有getversion(),Julia具有versioninfoVERSION,{{1} }还具有FreeMat功能。也许也可以使用。

P.S.3 已经有Matlab/Octave Compatibility toolbox可以用于scilab。还有Sci cosim可使用TCP端口将变量从Scilab工作区导入Octave。

1 个答案:

答案 0 :(得分: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来调用脚本。