与外部程序的双向通讯方式

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