#python #code-generation #plugin

已删除 python_mixin

已被弃用,推荐使用 external_mixin。使用 Python 生成您的 Rust 代码,直接在您的 Rust 代码中。

使用旧的 Rust 2015

0.0.2 2015年2月27日
0.0.1 2015年2月27日

#83 in #code-generation

MIT/Apache

16KB
254

python_mixin!

Build Status

已被弃用,推荐使用 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}二进制文件。

(也许这个表格会变得更长?谁知道呢。表格很酷。)

无运行时依赖

特性