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
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