Crabtime:一种新颖的 Rust 宏编写方式
- 比较:与 Proc Macros 和
macro_rules!对比,Crabtime 在输入输出类型、功能、使用便捷性等方面各有特点。例如,输入可作为 Token Stream、Macro Fragments 等,输出也有多种形式;具备高级转换、空间感知插值等功能,且可跨模块和 crate 复用等。 - 单次求值:使用
crabtime::eval可在编译时求值并粘贴输出,如const MY_NUM: usize = crabtime::eval! { (std::f32::consts::PI.sqrt() * 10.0).round() as usize }; - 函数式宏:用
crabtime::function属性定义函数式宏,如生成枚举代码的示例,还可使用#[macro_export]导出宏。 - 属性和派生宏:目前暂不支持生成属性和派生宏,可在 GitHub 上参与帮助。
- 输出方式:有
crabtime::output!、crabtime::quote!、返回字符串或数字、crabtime::output_str!、返回TokenStream等多种方式生成宏输出。 - 输入方式:有使用支持的参数、模式、
TokenStream等多种输入方式,推荐使用模式参数化。 - 性能:生命周期类似过程宏,在不稳定通道与过程宏性能相似,在稳定通道更改宏定义后稍慢。缓存功能可在夜间通道默认启用,稳定通道可通过
module属性启用,缓存路径等有相关设置,还会生成性能统计。 - 日志与调试:可通过
println!、crabtime::warning!、crabtime::error!等方式在控制台输出日志,也可使用 Stdout 协议及相关工具,注意 Crabtime 用 stdout 通信。 - 宏 Cargo 配置:不稳定通道自动从 Cargo.toml 获取配置,稳定通道需在宏块中提供配置,如
#![edition(2024)]等。 - 路径相关:提供
WORKSPACE_PATH、CRATE_CONFIG_PATH、CALL_SITE_FILE_PATH等路径变量,可用于遍历项目文件夹结构。 - 内部工作原理:函数内容粘贴到临时 Rust 项目的
main函数中,通过各种方式生成输出代码。 - 注意事项:缓存与当前文件路径相关,不能用 Crabtime 函数生成 consts,错误跨度未映射到源文件,
Crabtime::eval!不使用缓存。 - 调试排查:Rust IDE 对宏扩展处理不同,若 IDE 扩展
crabtime::output!有问题,可切换为crabtime::output_str!并报告问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。