此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

2.12.14 在外部程序中运行 Mathematica

在外部程序中运行 Mathematica 需要利用 MathLink 的许多特点.第一个问题是如何将 MathLink 连接到 Mathematica.
MathLink 模板产生能从 Mathematica 调用的外部程序时,建立 MathLink 连接的源代码会自动产生,在外部程序中要做的就是调用 MLMain(argc, ##1). 但一般要调用几个函数去建立 MathLink 连接.

打开和关闭 MathLink 连接

包括标准 MathLink 头函数

#include "mathlink.h"

int main(int argc, char *argv[]) {

MLENV env;
MLINK link;
long errno;

初始化 MathLink 库函数

env = MLInitialize(0);

打开一个 MathLink 连接,使用传递到主程序的同一变量响应

link = MLOpenArgv(env, argv, argv+argc, &errno);

激活连接,等待其它程序

MLActivate(link);

...
}

传递给 MLOpenArgv()argv 常常是直接从整个程序开始时传递给 main() argv 得到. 注意,MLOpenArgv() 将指针置于 2 数组的开头和结尾. 不直接使用 argc 就避免知道一个 int 的大小.
2 数组中的元素是字符串,它反映 Mathematica 函数 LinkLaunch, LinkCreateLinkConnect 的变量选项.

可能传递给MLOpenArgv( )的argv数组元素

MLOpenArgv() 的另一种选择是 MLOpenString(), 它将参数并置在一个字符串中, 参数中间有空格.
打开 MathLinkMathematica 内核的连接后,就能用标准的 MathLink 函数交换数据.

与 Mathematica 内核通讯的常用函数

MLPutFunction() 等发送了所有包以后,MathLink 要求调用 MLEndPacket() 去确认同步性和一致性.
在编写与 Mathematica 内核直接通讯的外部程序时,一个主要的方面是处理内核可以产生 的各种包.
函数 MLNextPacket() 寻找下一个来自于内核的包的头部,返回一个表明 该包类型的常数.

MLNextPacket( ) 识别的一些包

一直从一个链接读数据,遇到一个错误或发现一个 ReturnPacket 时停止

while ((p = MLNextPacket(link)) && p NotEqual RETURNPKT)
MLNewPacket(link);

将一个完整的前端写入 Mathematica 时,需要处理 Mathematica 能产生的各种 类型的包. 一般是在 MLNextPacket() 返回值上设置一个适当的转换 来完成这一任务.
MathLink Developer Kit 含有几个简单但完整的前端源代码的样本.

链接中的数据流

像前端等更复杂外部程序的特点之一是在等待从 Mathematica 发送的数据时 进行运算. 而在调用 MLNextPacket() 等标准 MathLink 库函数时, 直到该函数所需的数据备齐前程序是锁住的.
反复调用 MLReady() 可避免锁住,当 MLReady() 返回的不是 0 值时 仅调用 MLNextPacket() 等函数即可. MLReady()Mathematica 函数 LinkReadyQ 相似.
注意,MathLink 有时会将要发送的数据放在缓冲区内. 为了保证所有数据被送出. 应该调用 MLFlush(). 这之后调用 MLReady() 和等待返回的数据才有意义.