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

Octave和Scilab是否有类似C的预处理器指令用于可互用代码? 在C/C++语言中,可以使用宏或称为“每个处理器指令”来指示编译器应该如何读取代码。#def,#ifdef,#ifndef,#else,#endif。。。使编译器能够检查操作系统、编译器和其他环境信息。我知道Octave和Scilab是解释语言,但我想知道是否有任何方法可以告诉解释器在加载脚本时替换部分脚本?例如,我可以编写一个基于Scilab语法注释的代码/,然后指示解释器将其作为Octave的注释sytax读取为#或%?这似乎是Scilab倍频程互兼容性的主要问题之一,octave,scilab,preprocessor-directive,transpiler,mixed-programming,Octave,Scilab,Preprocessor Directive,Transpiler,Mixed Programming,如果有办法指示口译员检查口译员的信息Scilab/ScicoLab/Octave/FreeMat,Julia。。。而这个版本。。。然后根据这些信息有一些#ifdef#endif块。。。然后可以编写与上述多个解释器兼容的代码。如果您能让我知道加载时指令是否可行,如果不行,是否/如何编写与Octave和Scilab兼容的代码,我将不胜感激 p.S.1不同的方法有: 使用常规的if-then-elseif-else-end语句,包括跨不同口译员的有效语法,具有不同的结果。如以下答案所示 使用Scila

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

p.S.1不同的方法有:

  • 使用常规的
    if-then-elseif-else-end
    语句,包括跨不同口译员的有效语法,具有不同的结果。如以下答案所示
  • 使用Scilab端的
    get
    exec
    execstr
    加载
    .m
    文件。可以使用一些正则表达式来清理代码。Octave确实有类似于
    #…
  • 有一个定制的
    import
    函数,如made to import MATLAB代码到倍频程
  • p.S.2Octave有
    version()
    功能,Scilab/ScicosLab有
    getversion()
    ,Julia有
    versioninfo
    version
    FreeMat
    也有
    version
    功能。也许这也可以用


    p.S.3scilab已经有了。还可以使用TCP端口将变量从Scilab workspace导入Octave。

    您可以定义一个函数
    isscilab

    function [out] = isscilab()
            out = length(zeros(2)) == 1;
    endfunction
    
    并使用它有条件地执行代码:

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

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

    您可以定义一个函数
    isscilab

    function [out] = isscilab()
            out = length(zeros(2)) == 1;
    endfunction
    
    并使用它有条件地执行代码:

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

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

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

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

    八度音阶手册,不会带来严重的性能损失。我没有安装scilab来提供等效的测试,但我确信scilab也有一个简单的测试

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

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


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

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

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

    八度音阶手册,不会带来严重的性能损失。我没有安装scilab来提供等效的测试,但我确信scilab也有一个简单的测试

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

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


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

    您想编写在Scilab、ScicoLab、Octa上运行的代码吗