抓蟹时间 - Rust

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_PATHCRATE_CONFIG_PATHCALL_SITE_FILE_PATH等路径变量,可用于遍历项目文件夹结构。
  • 内部工作原理:函数内容粘贴到临时 Rust 项目的main函数中,通过各种方式生成输出代码。
  • 注意事项:缓存与当前文件路径相关,不能用 Crabtime 函数生成 consts,错误跨度未映射到源文件,Crabtime::eval!不使用缓存。
  • 调试排查:Rust IDE 对宏扩展处理不同,若 IDE 扩展crabtime::output!有问题,可切换为crabtime::output_str!并报告问题。
阅读 8
0 条评论