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

Install 安装一个与 MathLink 兼容的外部程序时,该程序被设置为有点像简化 Mathematica 内核一样去工作. 每次调用程序中的一个函数时,向该程序发生一个 CallPacket 包,该程序的响应是回送一个包装在 ReturnPacket 内的结果.

这里安装一个外部程序,返回用于连接这个程序的 LinkObject.
In[1]:=
Click for copyable input
Out[1]=
函数 向外部程序发送 CallPacket.
可以用 LinkWrite 直接发生 CallPacket. CallPacket 的第一个变量指出要调用外部程序内的函数.
In[3]:=
Click for copyable input
这里是外部程序对 CallPacket 的响应.
In[4]:=
Click for copyable input
Out[4]=

把一个外部程序 Install 安装几次时,Mathematica 就对这个程序打开几个 MathLink 连接. 每个连接总是对应于唯一的 LinkObject.

$CurrentLink当前运行的外部程序的 MathLink 连接

认定单个外部程序的各种例程.

:Begin:
:Function: addto
这里将 $CurrentLink 作为 的一个变量.
:Pattern:       addto[$CurrentLink, n_Integer]
:Arguments:     n
:ArgumentTypes: Integer
:ReturnType: Integer
:End:
每次程序开始时,将全局变量 置为0.
int counter = 0;
int addto(int n) 
counter += n;
return counter;
这里安装含有 的外部程序的一个例程.
In[5]:=
Click for copyable input
Out[5]=
这里安装另一个例程.
In[6]:=
Click for copyable input
Out[6]=
给外部程序的第一个例程中的 counter 加 10.
In[7]:=
Click for copyable input
Out[7]=
给外部程序的第一个例程中的 counter 加 15.
In[8]:=
Click for copyable input
Out[8]=
这里重新在程序的第一个例程上工作.
In[9]:=
Click for copyable input
Out[9]=

如果一个外部程序保持了其状态信息,就可以用程序的不同例程来表示其不同的状态. $CurrentLink 就提供了引用程序不同例程的方式.

当第一次安装外部程序的例程时或每次运行程序的一个例程时就设置一次 $CurrentLink 的值.

MLEvaluateString(stdlink,"string")Mathematica 发送一个输入,不返回结果

发送一个 Mathematica 计算的字符串.

MathLink 连接的双向功能可以用 Mathematica 调用外部程序,也可以使外部程序调用 Mathematica.

在最简单的情况中,可以用 MathLink 函数 Mathematica 发送一个字符串. Mathematica 计算这个字符串,进行该字符串指定的操作,但不向外部程序返回任何结果.

为了使结果返回,必须明确向 Mathematica 发送一个 EvaluatePacket,然后读出所返回的 ReturnPacket 中的内容.

这里开始一个 EvaluatePacket.
MLPutFunction(stdlink, "EvaluatePacket", 1);
这里构造表达式 Factorial[7] 或者 .
  MLPutFunction(stdlink, "Factorial", 1);
MLPutInteger32(stdlink, 7);
这里说明正在构造的包已经完成.
MLEndPacket(stdlink);
这里查看返回的 ReturnPacket.
MLCheckFunction(stdlink, "ReturnPacket", &n);
从这个包得到 的结果.
MLGetInteger32(stdlink, &ans);
MLEndPacket(stdlink)说明一个包已完成,它等待着向 Mathematica 发送

发送一个包到 Mathematica.

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

New to Mathematica? Find your learning path »
Have a question? Ask support »