使用Mathlink(Wolfram Mathematica)进行REPL(读取 - 评估循环)

时间:2012-01-23 16:54:58

标签: wolfram-mathematica mathlink

我是Mathlink的新手,在将其集成到我的代码中之前,我尝试编写一个小的REPL来习惯它。代码如下(省略了无关的部分,抱歉C和C ++的可怕混合):

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 个答案:

答案 0 :(得分:1)

EnterTextPacket MathLink数据包将使内核返回包含在ReturnTextPacket MathLink数据包中的结果。尝试将while循环中的条件更改为:

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