2012-01-23 1 views
1

Я новичок в Mathlink, и, прежде чем интегрировать его в свой код, я попытался написать небольшой REPL, чтобы привыкнуть к нему. Код выглядит следующим образом (irrelevent части опущены, и простите за ужасную смесь C и C++):REPL (Read-eval-print loop) с Mathlink (Wolfram Mathematica)

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; 
} 

но это, кажется, не работает. Я попытался заменить цикл while одной инструкцией MLNextPacket, но безрезультатно; Я часами искал документацию по Mathlink, но это большой беспорядок! Где я делаю это неправильно?

ответ

1

EnterTextPacket Пакет MathLink заставит ядро ​​вернуть результат, завернутый в пакет MathLink ReturnTextPacket. Попробуйте изменить состояние в вашем цикле while:

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

Работает как очарование, спасибо! Но если я попытался выйти из вида с CTRL-D, программа выйдет из строя ... Я добавил за пределы цикла: \t MLPutFunction (lp, «Exit», 0); \t closelink(); \t deinit(); но это не помогает ... – zakk

Смежные вопросы