2012-01-23 43 views
1

我是Mathlink的新手,在將其集成到我的代碼之前,我試着寫一個小的REPL以習慣它。的代碼如下(無關緊要部分省略,並且用於可怕共混物C和C++的對不起):用Mathlink(Wolfram Mathematica)編譯REPL(Read-eval-print loop)

int main(int argc,char **argv) 
{ 
    init_and_openlink(argc,argv); 

    while(!feof(stdin)) 
    { 
     int pkt; 
     char buf[1024]; 

     if(!fgets(buf,1024,stdin)) 
      continue; 

     MLPutFunction(lp,"EnterTextPacket",1); 
     MLPutString(lp,buf); 
     MLEndPacket(lp); 

     while(((pkt=MLNextPacket(lp),pkt))&&(pkt!=RETURNPKT)) 
     { 
      MLNewPacket(lp); 

      if(MLError(lp)) 
       return 1; 
     } 

     const char *result; 
     MLGetString(lp,&result); 
     printf("%s\n",result); 
     MLReleaseString(lp,result); 
    } 

    return 0; 
} 

但是它似乎沒有在所有的工作。我試過用單條MLNextPacket指令替換while循環,但無濟於事;我花了幾個小時搜索Mathlink文檔,但那是一個大混亂!我在哪裏做錯了?

回答

1

EnterTextPacket MathLink數據包將使內核返回封裝在MathLink數據包中的結果。嘗試改變您的while循環中的條件:

while(((pkt=MLNextPacket(lp),pkt))&&(pkt!=RETURNTEXTPKT)) 
+0

工作就像一個魅力,謝謝!但如果我試圖用CTRL-D退出外觀程序崩潰......我在循環外添加了: \t MLPutFunction(lp,「Exit」,0); \t closelink(); \t deinit(); 但它沒有幫助... – zakk

相關問題