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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。