如何将 a 转换proc_macro::Literal
为内部值?例如我有
use proc_macro::{ TokenStream, TokenTree };
#[proc_macro]
pub fn xtest(items: TokenStream) -> TokenStream {
if let Some(TokenTree::Literal(l)) = items.into_iter().next() {
println!("{:?}", l);
// output: Literal { kind: Integer, symbol: "0x42", suffix: None, span: #0 bytes(52..56) }
// how can I convert 'l'?
// assert_eq!(l, 0x42);
}
TokenStream::new()
}
并像使用它一样
#[test]
fn test_fn() {
xtest!(0x42);
}
在xtest
宏中,我需要知道对其运行操作的值。
目前,对数字文字的支持就足够了(在“1”、“0x10”、“1_000”等变体中)。对左右的解释1 << 2
会很好,但可以手动实现(当Literal
转换已解决时)。
背景
我想模拟 C 的指定初始化程序;例如写类似的东西
const VECTORS: vectors!(DefaultHandler, {
23 => UartHandler,
42 => AdcHandler,
}
扩展到
static VECTORS: [HandlerType; 43] = {
DefaultHandler,
DefaultHandler,
...
UartHandler /* at index 23 */,
...
AdcHandler /* at index 42 */
}