外部程序中的表达式操作
Wolfram 语言表达式提供了处理各种数据的一般方法,有时需要在外部程序中使用这些表达式. C 语言等并没有提供保存一般 Wolfram 语言表达式的直接方式. 但这可以用 Wolfram Symbolic Transfer Protocol (WSTP) 库中提供的环回链接(loopback links)来完成. 环回链接是外部程序中的局部 WSTP 连接,可以向它写入后面读出的表达式.
WSLINKWSLoopbackOpen(stdenv,int*errno) | |
打开一个环回链接 | |
voidWSClose(WSLINK link) | 关闭一个回路链接 |
intWSTransferExpression(WSLINK dest,WSLINK src) | 从 src 得到一个表达式并将它放入 dest |
...
wstp = WSLoopbackOpen(stdenv, &errno);
将表达式 Power[x,3] 放入环回链接中:
WSPutFunction(wstp, "Power", 2);
WSPutSymbol(wstp, "x");
WSPutInteger32(wstp, 3);
...
WSGetFunction(wstp, &head, &n);
WSGetSymbol(wstp, &sname);
WSGetInteger32(wstp, &k);
...
WSClose(wstp);
...
WSPutFunction(wstp, "Factorial", 1);
WSPutInteger32(wstp, 21);
这里将头 FactorInteger 送到 Wolfram 语言:
WSPutFunction(stdlink, "FactorInteger", 1);
WSTransferExpression(stdlink, wstp);
从链接取出一个表达式后它就不再保存. 但可以用 WSCreateMark() 去标记一个链接中表达式序列的某一位置,强制 WSTP 去保存该标记之后的表达式以便后面访问.
WSMARKWSCreateMark(WSLINK link) | 在链接中表达式序列的当前位置加一个标记 |
WSSeekMark(WSLINK link,WSMARK mark,int n) | |
返回到链接中指定标记后 n 个表达式的位置 | |
WSDestroyMark(WSLINK link,WSMARK mark) | 删除链接中的标记 |
...
WSPutInteger32(wstp, 45);
WSPutInteger32(wstp, 33);
WSPutInteger32(wstp, 76);
WSGetInteger32(wstp, &i);
mark = WSCreateMark(wstp);
WSGetInteger32(wstp, &i);
WSGetInteger32(wstp, &i);
WSSeekMark(wstp, mark, 0);
WSGetInteger32(wstp, &i);
WSDestroyMark(wstp, mark);
intWSGetNext(WSLINK link) | 在链接上找出下一个对象的类型 |
intWSGetArgCount(WSLINK link,int*n) | 将链接中函数变量的个数存为 n |
intWSGetSymbol(WSLINK link,char**name) | 得到符号名 |
intWSGetInteger32(WSLINK link,int*i) | 得到机器整数 |
intWSGetReal64(WSLINK link,double*x) | 得到机器浮点数 |
intWSGetString(WSLINK link,char**string) | 得到字符串 |
switch(WSGetNext(wstp)) {
case WSTKFUNC:
WSGetArgCount(wstp, &n);
recurse for head
for (i = 0; i < n; i++) {
recurse for each argument
}
…
case WSTKSYM:
WSGetSymbol(wstp, &name);
…
case WSTKINT:
WSGetInteger32(wstp, &i);
…
}
intWSPutNext(WSLINK link,int type) | 准备向链接放一个具有指定类型的对象 |
intWSPutArgCount(WSLINK link,int n) | 给出一个组合函数的变量个数 |
intWSPutSymbol(WSLINK link,char*name) | |
向链接放一个符号 | |
intWSPutInteger32(WSLINK link,int i) | 放一个机器整数 |
intWSPutReal64(WSLINK link,double x) | 放一个机器浮点数 |
intWSPutString(WSLINK link,char*string) | |
放一个字符串 |