2

我正在用 Rust 为 R 构建一个扩展 API。我使用过程宏注释我的函数,以生成具有适当转换和错误处理的 C 包装器:

use extendr_api::*;

#[export_function]
fn hello() -> &'static str {
    "hello"
}

这会生成一个可使用该机制hello__wrapper__从 R 调用的 C 函数。.Call

除此之外,我们需要为 R 元数据生成一个 NAMESPACE 文件:

export(hello)
useDynLib(libhello, "__wrap__hello")

还有一个文件lib.R

hello <- function() {
  .Call("__wrap__hello")
}

扩展 cargo 或 rustc 以编写此附加信息的最简单方法是什么?我猜从程序宏代码编写文件是个坏主意。

4

1 回答 1

0

据我了解,过程宏在编译时生成代码,但它必须是有效的 Rust 代码。我不认为在这种情况下程序宏是要走的路。

一种可能的解决方案是创建一个脚本,该脚本将遍历并在 Rust 文件中找到您导出的函数,并生成您需要的 2 个额外文件。如果你想在 Rust 中进行所有解析,你可以制作一个在编译之前运行的构建脚本,否则我建议使用 Python 之类的东西。

于 2020-06-23T13:40:23.953 回答