簡體   English   中英

是否存在用於Octave和Scilab的類似於C的預處理器指令用於兼容代碼?

[英]Are there C like pre-processor directives for Octave and Scilab to be used for intercompatible code?

在C / C ++語言中,可以使用宏或稱為“每處理器指令”的指令來指示編譯器應如何讀取代碼。 #ifdef #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語句, if then elseif else end語句包含跨不同解釋器的有效語法,並具有獨特的結果。 如以下答案中所建議。
  2. 從Scilab端使用getsexecexecstr加載.m文件。 可以做一些正則表達式來清除代碼。 八度確實具有xml,例如#<include>...</include>
  3. 有一個定制的import之類的函數這個由導入MATLAB代碼到八度

PS2 Octave具有version()函數,Scilab / ScicosLab具有getversion() ,Julia具有versioninfoVERSIONFreeMat也具有version功能。 也許也可以使用。

PS3已經為scilab提供了Matlab / Octave兼容性工具箱 還有Sci cosim ,可使用TCP端口將變量從Scilab工作區導入Octave。

我想換一個角度回答。 即,如果您需要比較預處理器指令,則可能是在考慮scilab和octave都錯了。 在C和C ++中必須使用預處理程序指令的原因是,因為它們是編譯語言。 在進行編譯之前,預處理程序指令會更改將要編譯的實際代碼。

在像matlab,scilab和octave這樣的解釋語言中,這種事情是多余的。 因此,執行足以區分三種環境的測試的簡單“ if / else”塊就足夠了。

八度音程手冊提出了一種區分八度音程和matlab的方法,該方法不會帶來嚴重的性能損失。 我沒有安裝scilab來提供等效測試,但是我敢肯定scilab也存在一個簡單的測試。

因此,在通過檢測正確的環境來運行不同代碼的情況下,這完全有可能。

在模仿#include策略的情況下,由於腳本是按順序運行的,因此您可以實現一個'if / else'塊,該塊僅在正確的時間運行另一個基本腳本。

PS。 Matlab已對腳本的解釋方式進行了一些更改,因此,如果執行“嵌套”錯誤檢查而不是表面錯誤檢查,則可能會導致問題。 但是,即使確實發生了這種情況,也可以直接使用run filename語法代替直接調用腳本,或者在更糟的情況下使用eval調用腳本。

您可以定義一個函數isscilab

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

並使用它有條件地執行代碼:

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

但是我認為最好的選擇是,您應該為Octave .m和Scilab .sce實現不同的文件,並執行所需的每個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM