#proc-macro #编译时 #源代码 #zig #执行 #匿名

comptime

编译时代码执行(即轻量级过程宏)

4个版本 (1个稳定版本)

1.0.0 2024年5月30日
0.1.1 2019年8月30日
0.1.0 2019年8月30日
0.0.1 2019年8月30日

#2049过程宏

每月35次 下载
用于 import_file_macro

MIT 许可证

13KB
208

轻量级编译时表达式评估。此crate受Zig的comptime的启发。

comptime宏调用内容的表达式将被解析为Rust源代码并插入到调用位置。

tl;dr: comptime!为你提供无上下文匿名过程宏。

示例

过程宏

#![feature(proc_macro_hygiene)]
fn main() {
    println!(concat!(
        "The program was compiled on ",
        comptime::comptime! {
            chrono::Utc::now().format("%Y-%m-%d").to_string()
        },
        "."
    )); // The program was compiled on 2024-05-22.
}

属性宏

fn main() {
    println!("{}", at_comptime()); // The program was compiled on 2024-05-22.
}
#[comptime::comptime_fn]
fn at_comptime() -> &'static str {
    format!(concat!(
        "The program was compiled on ",
        comptime::comptime! {
            chrono::Utc::now().format("%Y-%m-%d").to_string()
        },
        "."
    ))
}

限制

与真正的comptime不同,comptime!无法访问其被调用的作用域。在comptime!中运行的代码作为其自己的脚本。尽管技术上,你可以使用quote!来插值静态值。

此外,由于comptime!不编译依赖项,你必须在运行cargo (clippy|check)之前至少运行一次cargo build

使用comptime_fn生成的字符串将表示为&'static str,因为它在编译时已知,要修复此问题,你需要简单地运行String::from(comptime_fn())comptime_fn().to_string()

由于comptime宏的工作方式,写入stdout几乎肯定会造成comptime-rs构建失败。

comptime_fn 属性宏仍然会在编译时调用函数,但该函数内的所有计算都是在编译时进行的。例如:

#[comptime::comptime_fn]
fn costly_calculation() -> i32 {
    2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 // Any calculations
}

将转换为

#[comptime::comptime_fn]
fn costly_calculation() -> i32 {
    362880
}

贡献

请随时贡献!理想情况下,rustc 也会有一个(真正的)comptime,它可以访问类型信息和其它静态值。在此期间,这应该是一种很好的近似和实验此类功能的方法。

依赖项

~1.5MB
~35K SLoC