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