设置从 Wolfram 语言中调用的外部函数
在 Wolfram 语言中调用在外部程序中定义的函数时,需要增添适当的 Wolfram Symbolic Transfer Protocol (WSTP) 代码以传递函数的变量和得到函数所产生的结果.
:Begin:
:Function: f
:Pattern: f[x_Integer, y_Integer]
:Arguments: {x, y}
:ArgumentTypes: {Integer, Integer}
:ReturnType: Integer
:End:
:Begin: | 一个函数模板的开始 |
:Function: | 外部程序中的函数名 |
:Pattern: | 调用该函数的方式 |
:Arguments: | 函数的变量 |
:ArgumentTypes: | 函数变量的类型 |
:ReturnType: | 函数返回值的类型 |
:End: | 一个函数模板的结束 |
:Evaluate: | 函数安装后计算 Wolfram 语言的输入 |
#include "wstp.h"
int f(int x, int y) {
return x+y;
}
int main(int argc, char *argv[]) {
return WSMain(argc, argv);
}
约定将 WSTP 模板放在形如 file.tm 的文件中. 这类文件也可以含有散步在不同函数模板中的 C 语言代码.
例如,在 Unix 中,WSTP Developer Kit 有一个名为 wscc 的程序,它对任何文件中以 .tm 结尾的 WSTP 模板进行预处理,然后对结果中的 C 源代码调用 cc. wscc 将命令行选项和其它文件直接传递给 cc.
wscc -o f.exe f.tm f.c
在 Wolfram 语言中,WSTP Developer Kit 一般包含一个名为 mprep 的程序,必须将要处理的 .tm 文件作为输入直接调用它. mprep 输出产生 C 源代码,它可以送往 C 编译器.
Install["prog"] | 安装外部程序 |
Uninstall[link] | 卸载外部程序 |
Links["prog"] | 显示与 "prog" 有关的激活链接 |
Links[] | 显示所有激活链接 |
LinkPatterns[link] | 显示在一个链接中可以被计算的模式 |
处理 WSTP 模板文件时做两件基本事情:第一,用 :Pattern: 和 的给定值产生一个 Wolfram 语言定义,它通过 WSTP 调用外部函数. 第二,用 :Function:、 和 的给定值产生 C 源代码,它在外部程序中调用函数.
:Begin:
:Function: prog_add
:Pattern: SkewAdd[x_Integer, y_Integer:1]
:Arguments: {x, If[x > 1, y, y + x - 2]}
:ArgumentTypes: {Integer, Integer}
:ReturnType: Integer
:End:
在 WSTP 模板中,:Pattern: 和 的指定值都可以是任何 Wolfram 语言表达式. 对 的指定值在每次调用外部函数时计算. 计算的结果将作为变量列表传递给函数.
这可以用在 WSTP 模板中插入 :Evaluate: 指定值来实现. 在 :Evaluate: 之后给出的表达式可以持续多行,它在遇到第一个空行时结束,或者在遇到第一个字符不是空格或跳格键的行时结束.
:Evaluate: SkewAdd::usage = "SkewAdd[x, y] performs
a skew addition in an external program."
:Evaluate: BeginPackage["XPack`"]
:Evaluate: XF1::usage = "XF1[x, y] is one external function."
:Evaluate: XF2::usage = "XF2[x] is another external function."
:Evaluate: Begin["`Private`"]
:Begin:
:Function: f
:Pattern: XF1[x_Integer, y_Integer]
:Arguments: {x, y}
:ArgumentTypes: {Integer, Integer}
:ReturnType: Integer
:End:
:Begin:
:Function: g
:Pattern: XF2[x_?NumberQ]
:Arguments: {x}
:ArgumentTypes: {Real}
:ReturnType: Real
:End:
:Evaluate: End[ ]
:Evaluate: EndPackage[ ]
int f(int i, int j) {
return i + j;
}
double g(double x) {
return x*x;
}
用:Evaluate: 设定值可以在第一次安装一个外部程序时计算 Wolfram 语言表达式. 此时也可以通过在调用 WSMain()之前将代码插入 main() 中执行外部程序中的代码. 这在使用外部程序中的函数之前对它进行初始化时是有用的.
WSEvaluateString(stdlink,"string") | 计算一个字符串将其作为 Wolfram 语言输入 |
int diff(int i, int j) {
if (i < j) WSEvaluateString(stdlink, "Print[\"negative\"]");
return i - j;
}