3个不稳定版本
0.1.1 | 2020年3月20日 |
---|---|
0.1.0 | 2020年3月20日 |
0.0.1 | 2020年3月13日 |
1399 在 过程宏 中
每月 31 次下载
在 2 个crate中使用(通过 slip-imp)
36KB
928 行
absolution
"摆脱 syn 的束缚"
此crate提供了一种可内省的token树表示,用于编写Rust过程宏。它仍然有些不稳定:它是可用的,但我还没有完全决定API的形状,可能会发布破坏性变更。我欢迎各种反馈!
proc-macro2
crate提供了一个token树表示,但是由于向后兼容性的原因,这种表示并不易于内省,您需要进一步解析才能使用它。例如,Literal
类型实际上没有提供有关包含的文本的任何其他信息,只说明它是一个文本。
通常,如果人们想要进一步内省代码,会引入令人惊叹的 syn crate;syn
将Rust代码解析为完整的、易于内省的AST,便于工作。当编写自定义derives时,您的过程宏将应用于某些Rust项,这是非常棒的。
然而,像 format!()
这样的感叹号风格的过程宏通常不需要内省Rust AST,它们只需要查看tokens。例如,一个非常简单的 format!()
实现只需要能够读取初始格式字符串,然后获取参数的逗号分隔的token树。为此在依赖树中引入整个Rust解析器有些过度。
absolution
提供了一种类似于 proc-macro2
的可内省token树表示,用于设计感叹号风格的过程宏。
目前,proc-macro-hack
crate仍然依赖于 syn
来工作,因此这个crate目前对任何属性风格的过程宏都没有用。
使用方法,只需使用 Into
将从 proc_macro
或 proc_macro2
标记流转换为 absolution
流,使用 quote!
进行反向转换。
extern crate proc_macro;
use absolution::{Ident, LitKind, Literal, TokenStream, TokenTree};
use quote::quote;
#[proc_macro]
pub fn make_func(tt: proc_macro::TokenStream) -> proc_macro::TokenStream {
let stream: TokenStream = tt.into();
let first_token = &stream.tokens[0];
let s = if let TokenTree::Literal(Literal {
kind: LitKind::Str(s),
..
}) = &first_token
{
s
} else {
panic!("Must start with a string!")
};
let ident = Ident {
ident: s.to_string(),
span: first_token.span(),
};
quote!(
fn #ident() -> &'static str {
#first_token
}
)
.into()
}
更多示例,请参阅 examples/string-enum
许可证
根据您的选择,可在 Apache License, Version 2.0 或 MIT 许可证 下获得许可。除非您明确表示,否则您提交的任何有意包含在此包中的贡献,如 Apache-2.0 许可证所定义,应按上述方式双重许可,而不附加任何额外的条款或条件。
依赖项
~80KB