Существуют ли C-подобные директивы препроцессора для Octave и Scilab, которые будут использоваться для совместимого кода? - PullRequest
1 голос
/ 12 марта 2019

В языках C / C ++ можно использовать макросы или так называемые «директивы для процессора», чтобы указать компилятору, как должен читаться код.Простые команды #def, #ifdef, #ifndef, #else, #endif ... дают компилятору возможность проверить операционную систему, компилятор и другую информацию о среде.Я знаю, что Octave и Scilab являются интерпретируемыми языками, но мне интересно, есть ли способ сказать интерпретатору заменять части скрипта при его загрузке?Например, могу ли я написать код, который комментируется на основе синтаксиса Scilab //, а затем дать указание интерпретатору прочитать их как синтаксис комментариев Octave как # или %?Похоже, это одна из главных проблем совместимости 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 Октава имеет функцию version(), Scilab / ScicosLab имеет getversion(), Джулия имеет versioninfo и VERSION, FreeMat также имеет функцию version.возможно, это также можно использовать.

PS3 уже есть Matlab / Octave Набор инструментов для совместимости для scilab.Также имеется Sci cosim для импорта переменных из рабочей области Scilab в Octave с использованием порта TCP.

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Я хочу ответить под другим углом. А именно, если вы чувствуете необходимость сравнивать директивы препроцессора, вы, возможно, думаете о scilab и октаве все неправильно. Директивы препроцессора необходимы в C и C ++ потому, что это скомпилированные языки. Директивы препроцессора вносят изменения в фактический код, который будет скомпилирован, прежде чем произойдет компиляция.

В интерпретируемом языке, таком как matlab, scilab и octave, такие вещи избыточны. Таким образом, простой блок if / else, выполняющий тест, который адекватно различает три среды, должен быть адекватным.

Руководство по октаве предлагает способ различения октавы и matlab , который не влечет за собой значительных потерь производительности. У меня не установлен scilab для обеспечения эквивалентного теста, но я уверен, что для scilab также существует простой тест.

Таким образом, в контексте запуска другого кода путем определения правильной среды это вполне возможно.

В контексте имитации стратегии #include, поскольку скрипт запускается последовательно, вы можете реализовать блок 'if / else', который просто запускает другой базовый скрипт в нужный момент.

PS. Matlab внес некоторые изменения в способ интерпретации сценариев, поэтому это может привести к проблемам, если он выполняет «вложенную» проверку ошибок, а не поверхностную проверку ошибок. Но даже если это произойдет, просто вместо непосредственного вызова сценария можно использовать синтаксис run filename или, в худшем случае, использовать для вызова сценария eval.

1 голос
/ 12 марта 2019

Вы можете определить функцию isscilab:

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

И использовать его для условного выполнения кода:

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

Но я думаю, что лучший выбор заключается в том, что вы должны реализовать различные файлы для Octave .m и Scilab .sce и выполнить каждый, который вы хотите.

...