1 个不稳定版本
| 0.1.0 | 2019年5月13日 |
|---|
#1053 在 过程宏
160KB
3.5K SLoC
Sonic Spin
声明一个宏,将 ::() 后缀操作符转换为通用后缀操作符。
主要通过重新定义来自 syn 的结构进行解析。
示例
#![feature(proc_macro_hygiene)]
use sonic_spin::sonic_spin;
sonic_spin! {
let res = 0::(match) {
x => x + 2
}::(match) {
x => x + 10
};
assert_eq!(res, 12);
let mut acc = 0;
(0..3)::(for _ in) {
acc += 1;
};
assert_eq!(acc, 3);
}
请参阅 tests/ 获取更多示例。
动机
鉴于有关 await 语法及其导致的一般后缀操作符可能性的许多讨论,这个crate通过“sonic-spin”操作符(::())探讨了这种可能性。
如果 await 语法最终是“前缀 await” await expr,则此crate将使语法 expr::(await) 与 ? 后缀操作符类似。
一些提到的讨论
- https://internals.rust-lang.org/t/idea-universal-pipelining-a-k-a-making-await-generic/9973
- https://github.com/rust-lang/rfcs/pull/2442
进一步工作
- 探索后缀宏如何工作。
- 测试 await 用例(即使它已经是一个后缀操作符)。
- 探索自动括号添加。
管道操作
对于管道操作,请参阅 tests/common.rs::Pipe 特性和它在 tests/if.rs::if_pipe 函数中的应用。即,sonic-spin 对于此类操作不是必需的。
备注
这是一个草案,基于这个建议
https://github.com/rust-lang/rfcs/issues/2698
依赖项
~1.5MB
~29K SLoC