#wolfram-language #wolfram #wolfram-engine #wstp

wolfram-library-link

与Wolfram LibraryLink的绑定

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

Download history 41/week @ 2024-04-21 133/week @ 2024-04-28 23/week @ 2024-05-05 33/week @ 2024-05-12 25/week @ 2024-05-19 61/week @ 2024-05-26 38/week @ 2024-06-02 31/week @ 2024-06-09 32/week @ 2024-06-16 44/week @ 2024-06-23 71/week @ 2024-06-30 22/week @ 2024-07-07 21/week @ 2024-07-14 29/week @ 2024-07-21 39/week @ 2024-07-28 10/week @ 2024-08-04

每月下载量103
symbolica中使用

MIT/Apache

1.5MB
46K SLoC

wolfram-library-link

Crates.io License Documentation

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"]]

另请参阅:NumericArrayLibraryDataType

示例程序

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、低级MArgumentWSLINK类型以及手动WSTP操作。

Rust代码 Wolfram语言代码
raw_librarylink_function.rsraw_wstp_function.rs RawFunctions.wlt

其他示例

除了经过磨砺的高级示例之外,wolfram-library-link/examples/tests/ 目录还包含针对更广泛的范围的功能和行为测试代码,可能是一个有用的补充参考。在RustLink/Tests/ 目录中包含加载和调用测试函数的Wolfram语言单元测试逻辑。

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 语言的实用工具。

许可协议

许可协议为以下之一

任选其一。

注意:由 wstp 包链接的 WSTP 库的许可协议受 MathLink 许可协议 的条款约束。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中的贡献,均应双重许可如上所述,不附加任何额外条款或条件。

有关更多信息,请参阅 CONTRIBUTING.md

开发者笔记

有关向 wolfram-library-link 包贡献时的常见开发任务的说明,请参阅 Development.md

有关如何保持 wolfram-library-link 与 Wolfram 语言新版本同步的说明,请参阅 Maintenance.md

依赖项

~3–7.5MB
~150K SLoC