44 个重大版本发布
使用旧的 Rust 2015
0.58.1 | 2017 年 2 月 19 日 |
---|---|
0.57.0 | 2017 年 1 月 25 日 |
0.52.0 | 2016 年 11 月 26 日 |
0.39.0 | 2016 年 7 月 26 日 |
0.0.0 | 2014 年 12 月 5 日 |
在 #expansion 中排名第 32
每月下载量 6,961
此 crate 已失去人气
16KB
362 行代码(不含注释)
Syntex 代码生成框架
syntex
是一个允许编译时间语法扩展展开的库。这使用户能够在稳定 Rust 中使用类似 serde 的库。
使用 Cargo 进行配置
创建一个包
[package]
name = "hello_world_macros"
version = "0.2.0"
authors = [ "[email protected]" ]
[dependencies]
syntex = "*"
syntex_syntax = "*"
使用它
Cargo.toml
[package]
name = "hello_world"
version = "0.3.0"
authors = [ "[email protected]" ]
build = "build.rs"
[build-dependencies]
syntex = "*"
build.rs
extern crate syntex;
extern crate hello_world_macros;
use std::env;
use std::path::Path;
fn main() {
let mut registry = syntex::Registry::new();
hello_world_macros::register(&mut registry);
let src = Path::new("src/main.rs.in");
let dst = Path::new(&env::var("OUT_DIR").unwrap()).join("main.rs");
registry.expand("hello_world", &src, &dst).unwrap();
}
src/main.rs
// Include the real main
include!(concat!(env!("OUT_DIR"), "/main.rs"));
src/main.rs.in
fn main() {
let s = hello_world!();
println!("{}", s);
}
局限性
遗憾的是,由于 Rust 尚未提供稳定的插件支持,syntex 无法执行某些操作
- syntex 生成的代码在生成的文件中报告错误,而不是在源文件中。
- Syntex 宏不能嵌入它不了解的宏中,如内置的
vec![]
、println!(...)
等。这是因为这些宏可能会覆盖macro_name!(...)
以表示不同的含义。