使用旧的 Rust 2015
0.0.2 |
|
---|---|
0.0.1 |
|
#83 in #code-generation
16KB
254 行
python_mixin!
已被弃用,推荐使用 external_mixin
编写 Python 代码以在您的 crate 中直接生成 Rust 代码。
#![feature(plugin)]
#![plugin(python_mixin)]
python_mixin! {"
x = 1 + 2
print('fn get_x() -> u64 { %d }' % x)
"}
fn main() {
let value = get_x();
assert_eq!(value, 3);
}
我实际上应该使用它吗?
可能不是,这主要是我在尝试 更多 语言 插件。一种更便携/可用的代码生成方式是通过 一个 Cargo
构建脚本 加上 include!
宏。
一些缺点(不全面)
-
python_mixin!
依赖于用户路径中存在正确命名的 Python 可执行文件,例如,有时 "python
" 是 Python 2,有时是 Python 3,这要求用户在 Windows 上安装 Python。(构建脚本只需要 Cargo 和 Rust 编译器,如果用户尝试构建您的 Rust 代码,则他们肯定拥有这些。) -
生成的代码中的错误难以调试,尽管该宏尽量提供尽可能有用的错误信息,例如,由 Python 生成的文件/行号尽可能接近包含源代码的原始字符串的相关部分(包括与编辑器的跳转到错误功能一起工作)。解析的 Rust 实际上并没有在任何磁盘上出现或类似的地方,因此您无法轻松地看到编译器抱怨时的完整上下文(相比之下,构建脚本只是在您的文件系统中生成一个普通文件)。
安装
可在 crates.io 上找到,因此您只需将其
[dependencies]
python_mixin = "*"
添加到您的 Cargo.toml
。
文档
python_mixin!
宏接受一个字符串,将其传递给 Python 解释器,然后解析该解释器的输出作为 Rust 代码。它像一个 macro_rules!
宏一样工作,可以在任何 AST 位置使用:表达式、项等。
python_mixin!
的字符串参数本身可以是一个宏调用,它会在传递给 Python 之前展开。
可以在 Python 字符串之前的一个可选的 { ... }
块中指定选项(以逗号分隔)。有关可能选项的详细信息,请参阅 选项。
示例
通过调用Python的time.time
函数来计算程序构建时的Unix时间。
#![feature(plugin)]
#![plugin(python_mixin)]
fn main() {
let time_of_build = python_mixin! {"
import time
print(time.time())
"};
println!("this was compiled at {}", time_of_build);
}
使用Python 2的裸print语句和Python 3的除法语义
#![feature(plugin)]
#![plugin(python_mixin)]
fn main() {
let value2 = python_mixin! {
{ version = "2" }
"print 1 / 2"
};
let value3 = python_mixin! {
{ version = "3" }
"print(1 / 2)"
};
assert_eq!(value2, 0);
assert_eq!(value3, 0.5);
}
以最佳方式计算斐波那契数,通过让Python打印一个计算每个数的函数
#![feature(plugin)]
#![plugin(python_mixin)]
// create fib_0, fib_1, ..., fib_N functions that return the
// respective fibonacci number.
python_mixin! { r#"
print("fn fib_0() -> u64 { 0 }")
print("fn fib_1() -> u64 { 1 }")
def make_function(n):
print("fn fib_%d() -> u64 { fib_%d() + fib_%d() }" % (n, n - 1, n - 2))
for i in range(2, 30 + 1):
make_function(i)
"#}
fn main() {
println!("the 30th fibonacci number is {}", fib_30());
}
选项
名称 | 类型 | 默认值 | |
---|---|---|---|
版本 |
字符串 | "" |
控制所使用的Python版本:python_mixin! 尝试执行python{version} 二进制文件。 |
(也许这个表格会变得更长?谁知道呢。表格很酷。)