12个版本
0.2.10 | 2023年8月28日 |
---|---|
0.2.9 | 2023年2月4日 |
0.2.7 | 2022年9月19日 |
0.2.6 | 2022年8月29日 |
0.1.2 | 2022年2月9日 |
在FFI类别中排名34
每月下载量103
在symbolica中使用
1.5MB
46K SLoC
wolfram-library-link
API文档 | 变更日志 | 贡献指南
绑定到Wolfram LibraryLink接口,使从Wolfram语言调用Rust代码成为可能。
该库用于编写可以被Wolfram LibraryLink函数族加载的Rust程序,特别是通过LibraryFunctionLoad[]
。
功能
- 从Wolfram代码中高效调用Rust函数。
- 在Rust代码和Wolfram代码之间传递任意Wolfram表达式。
- 从Rust代码中评估Wolfram表达式。
- 在Rust代码中响应Wolfram 中止请求。
- 使用
wstp
crate的安全API处理Wolfram符号传输协议。
遵循快速入门指南开始使用wolfram-library-link
。
查看为什么选择Rust?,了解Rust在编写用于Wolfram语言的本机代码时的一些优点:性能、内存和线程安全、高级特性等。
快速示例
本节中的示例使用两个连续的代码块编写。第一个展示了Rust代码,第二个展示了用于加载和使用相关Rust函数(组)所需的Wolfram语言代码。
基本数据类型
use wolfram_library_link::export;
#[export]
fn square(x: i64) -> i64 {
x * x
}
square = LibraryFunctionLoad["...", "square", {Integer}, Integer];
square[5]
另请参阅:LibraryFunctionLoad
高效的数值数组
在Wolfram语言中创建一个包含一百万个整数的数组,并使用Rust计算总数
use wolfram_library_link::{export, NumericArray};
#[export]
fn total(array: &NumericArray<i64>) -> i64 {
array.as_slice().into_iter().sum()
}
total = LibraryFunctionLoad[
"...",
"square",
{LibraryDataType[NumericArray, "Integer64"]},
Integer
];
total[NumericArray[Range[1000000], "Integer64"]]
另请参阅:NumericArray
,LibraryDataType
示例程序
wolfram-library-link/examples 子目录包含展示 wolfram-library-link
API 特性的示例程序。
Rust代码 | Wolfram语言代码 | 演示... |
---|---|---|
basic_types.rs | BasicTypes.wlt | 如何编写Rust LibraryLink函数,利用基本、原生类型,如整数、浮点实数和字符串,以高效传递。 |
numeric_arrays.rs | NumericArrays.wlt | 如何使用NumericArray 数据类型高效地传递大型统一数值数据的多维数组。 |
wstp.rs | WSTP.wlt | 如何使用WSTP Link 将任意表达式传递到和从LibraryLink函数。 |
aborts.rs | Aborts.wlt | 如何让Rust代码响应Wolfram 中断请求。 |
async_file_watcher.rs | AsyncExamples.wlt | 如何让Rust代码生成异步事件,触发Wolfram评估以处理事件。 |
managed.rs | ManagedExpressions.wlt | 如何使用管理表达式API在Wolfram表达式解除分配时释放库数据。 |
data_store.rs | DataStore.wlt | 如何使用DataStore 数据类型高效地传递由原生LibraryLink数据类型组成的任意表达式样式的异构结构。 |
原始函数
这些示例演示了如何编写使用“原始”低级LibraryLink和WSTP接口的函数,使用extern "C"
ABI、低级MArgument
和WSLINK
类型以及手动WSTP操作。
Rust代码 | Wolfram语言代码 |
---|---|
raw_librarylink_function.rs 和 raw_wstp_function.rs | RawFunctions.wlt |
其他示例
除了经过磨砺的高级示例之外,wolfram-library-link/examples/tests/ 目录还包含针对更广泛的范围的功能和行为测试代码,可能是一个有用的补充参考。在RustLink/Tests/ 目录中包含加载和调用测试函数的Wolfram语言单元测试逻辑。
构建wolfram-library-link
wolfram-library-link
依赖于 wstp
包来提供对 Wolfram 符号传输协议(WSTP)的绑定。构建 wstp
包需要访问 WSTP SDK,该 SDK 提供了 WSTP 静态库。 wstp
使用 wolfram-app-discovery
来定位包含合适 WSTP SDK 的本地 Wolfram 语言安装。如果找不到 WSTP SDK,则 wstp
将无法构建,进而 wolfram-library-link
也将无法构建。
如果您已将 Wolfram 语言安装到了 wolfram-app-discovery
所不知的位置,您可以通过设置环境变量 WOLFRAM_APP_DIRECTORY
来手动指定安装位置。有关详细信息,请参阅 配置 wolfram-app-discovery。
相关链接
相关包
wstp
— Wolfram 符号传输协议的绑定,用于在程序之间传递任意 Wolfram 表达式。wolfram-expr
— Wolfram 语言表达式的原生 Rust 表示。wolfram-app-discovery
— 定位本地 Wolfram 应用程序和 Wolfram 语言的实用工具。
相关文档
- Wolfram LibraryLink 用户指南
- 使用 LibraryLinkUtilities 引入 C++ 和 Wolfram 语言,它是围绕 LibraryLink API 的 C++ 包装器。
许可协议
许可协议为以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
注意:由 wstp 包链接的 WSTP 库的许可协议受 MathLink 许可协议 的条款约束。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中的贡献,均应双重许可如上所述,不附加任何额外条款或条件。
有关更多信息,请参阅 CONTRIBUTING.md。
开发者笔记
有关向 wolfram-library-link
包贡献时的常见开发任务的说明,请参阅 Development.md。
有关如何保持 wolfram-library-link
与 Wolfram 语言新版本同步的说明,请参阅 Maintenance.md。
依赖项
~3–7.5MB
~150K SLoC