#postfix #spin #operator #sonic #general #features #read

nightly macro sonic_spin

将 ::() 读取为通用后缀操作符

1 个不稳定版本

0.1.0 2019年5月13日

#1053过程宏

MIT 许可证

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)? 后缀操作符类似。

一些提到的讨论

进一步工作

  • 探索后缀宏如何工作。
  • 测试 await 用例(即使它已经是一个后缀操作符)。
  • 探索自动括号添加。

管道操作

对于管道操作,请参阅 tests/common.rs::Pipe 特性和它在 tests/if.rs::if_pipe 函数中的应用。即,sonic-spin 对于此类操作不是必需的。

备注

这是一个草案,基于这个建议
https://github.com/rust-lang/rfcs/issues/2698

依赖项

~1.5MB
~29K SLoC