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日

#874过程宏

Download history 22/week @ 2024-03-11 28/week @ 2024-03-18 14/week @ 2024-03-25 41/week @ 2024-04-01 30/week @ 2024-04-08 18/week @ 2024-04-15 127/week @ 2024-04-22 46/week @ 2024-04-29 33/week @ 2024-05-06 42/week @ 2024-05-13 23/week @ 2024-05-20 73/week @ 2024-05-27 32/week @ 2024-06-03 40/week @ 2024-06-10 31/week @ 2024-06-17 48/week @ 2024-06-24

每月 160 次下载
2 个crate中(通过 wolfram-library-link)使用

MIT/Apache

18KB
281

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提供的Wolfram符号传输协议的安全API。

按照 快速入门 指南开始使用 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 crate,用于将 Wolfram 符号传输协议(WSTP)的绑定。构建 wstp crate 需要 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 crate 链接的 WSTP 库的许可受 MathLink 许可协议 条款约束。

贡献

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

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

开发人员说明

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

有关在 Wolfram 语言新版本发布时保持 wolfram-library-link 更新的说明,请参阅 Maintenance.md

依赖关系

~1.5MB
~35K SLoC