与外部程序的双向通讯方式
用 Install 安装一个与 MathLink 兼容的外部程序时,该程序被设置为有点像简化 Mathematica 内核一样去工作. 每次调用程序中的一个函数时,向该程序发生一个 CallPacket 包,该程序的响应是回送一个包装在 ReturnPacket 内的结果.
| Out[1]= |  |
| Out[4]= |  |
把一个外部程序 Install 安装几次时,Mathematica 就对这个程序打开几个 MathLink 连接. 每个连接总是对应于唯一的 LinkObject.
认定单个外部程序的各种例程.
:Pattern: addto[$CurrentLink, n_Integer]
:Arguments:
n
:ArgumentTypes:
Integer
:ReturnType: Integer
:End:
每次程序开始时,将全局变量

置为0.
int addto(int n) 
counter += n;
return counter;

这里安装含有

的外部程序的一个例程.
| Out[5]= |  |
| Out[6]= |  |
给外部程序的第一个例程中的 counter 加 10.
| Out[7]= |  |
给外部程序的第一个例程中的 counter 加 15.
| Out[8]= |  |
| Out[9]= |  |
如果一个外部程序保持了其状态信息,就可以用程序的不同例程来表示其不同的状态. $CurrentLink 就提供了引用程序不同例程的方式.
当第一次安装外部程序的例程时或每次运行程序的一个例程时就设置一次 $CurrentLink 的值.
发送一个 Mathematica 计算的字符串.
MathLink 连接的双向功能可以用 Mathematica 调用外部程序,也可以使外部程序调用 Mathematica.
在最简单的情况中,可以用 MathLink 函数
向 Mathematica 发送一个字符串. Mathematica 计算这个字符串,进行该字符串指定的操作,但不向外部程序返回任何结果.
为了使结果返回,必须明确向 Mathematica 发送一个 EvaluatePacket,然后读出所返回的 ReturnPacket 中的内容.
MLPutFunction(stdlink, "EvaluatePacket", 1);
MLPutFunction(stdlink, "Factorial", 1);
MLPutInteger32(stdlink, 7);
MLCheckFunction(stdlink, "ReturnPacket", &n);
从这个包得到

的结果.
MLGetInteger32(stdlink, &ans);
发送一个包到 Mathematica.
向 Mathematica 发送一个 EvaluatePacket[input] 时,它一般会产生许多包来响应,但最后一个包必须是ReturnPacket[output]. "外部程序中的表达式操作" 节中将讨论怎样处理事先不知道结构的这些包或表达式序列.