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

Download history 1713/week @ 2024-03-13 2091/week @ 2024-03-20 2189/week @ 2024-03-27 1750/week @ 2024-04-03 1554/week @ 2024-04-10 1890/week @ 2024-04-17 1903/week @ 2024-04-24 1754/week @ 2024-05-01 1523/week @ 2024-05-08 1721/week @ 2024-05-15 1849/week @ 2024-05-22 2297/week @ 2024-05-29 1688/week @ 2024-06-05 1563/week @ 2024-06-12 1830/week @ 2024-06-19 1573/week @ 2024-06-26

每月下载量 6,961
此 crate 已失去人气

MIT/Apache

16KB
362 行代码(不含注释)

Syntex 代码生成框架

Build Status Latest Version

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!(...) 以表示不同的含义。

依赖项