与外部程序的双向通讯方式
用 Install 安装一个与 Wolfram Symbolic Transfer Protocol (WSTP) 兼容的外部程序时,该程序被设置为有点像简化 Wolfram 语言内核一样去工作. 每次调用程序中的一个函数时,向该程序发生一个 CallPacket 包,该程序的响应是回送一个包装在 ReturnPacket 内的结果.
这里安装一个外部程序,返回用于连接这个程序的 LinkObject:
这里是外部程序对 CallPacket 的响应:
$CurrentLink | 当前运行的外部程序的 WSTP 连接 |
:Begin:
:Function: addto
:Pattern: addto[$CurrentLink, n_Integer]
:Arguments: {n}
:ArgumentTypes: {Integer}
:ReturnType: Integer
:End:
int counter = 0;
int addto(int n) {
counter += n;
return counter;
}
如果一个外部程序保持了其状态信息,就可以用程序的不同例程来表示其不同的状态. $CurrentLink 就提供了引用程序不同例程的方式.
当第一次安装外部程序的例程时或每次运行程序的一个例程时就设置一次 $CurrentLink 的值.
WSEvaluateString(stdlink,"string") | 向 Wolfram 系统发送一个输入,不返回结果 |
在最简单的情况中,可以用 WSTP 函数 WSEvaluateString() 向 Wolfram 系统发送一个字符串. Wolfram 系统计算这个字符串,进行该字符串指定的操作,但不向外部程序返回任何结果.
这里开始一个 EvaluatePacket:
WSPutFunction(stdlink, "EvaluatePacket", 1);
WSPutFunction(stdlink, "Factorial", 1);
WSPutInteger32(stdlink, 7);
WSEndPacket(stdlink);
这里查看返回的 ReturnPacket:
WSCheckFunction(stdlink, "ReturnPacket", &n);
WSGetInteger32(stdlink, &ans);
WSEndPacket(stdlink) | 说明一个包已完成,它等待着向 Wolfram 系统发送 |
向 Wolfram 系统发送一个 EvaluatePacket[input] 时,它一般会产生许多包来响应,但最后一个包必须是ReturnPacket[output]. "外部程序中的表达式操作" 节中将讨论怎样处理事先不知道结构的这些包或表达式序列.