Crates.io | postfix-macros |
lib.rs | postfix-macros |
version | 0.1.0 |
source | src |
created_at | 2020-11-07 20:02:54.505675 |
updated_at | 2020-11-07 20:02:54.505675 |
description | Postfix macros on stable Rust, today |
homepage | |
repository | https://github.com/est31/postfix-macros |
max_upload_size | |
id | 309721 |
size | 31,269 |
Postfix macros on stable Rust, today.
arr.get(10).unwrap_or!(return Err(()));
"hello world".println!();
42.assert_ne!(4 + 2);
val.iter()
.map(|v| v.1)
.find(|z| z.matches!(Custom::Enum(_) | Custom::EnumOther))
.dbg!();
WARNING: ALPHA QUALITY SOFTWARE. There are precedence bugs. Please verify manually during usage that you aren't affected by them.
RFC 2442 proposes to add postfix macros to the Rust language. However, there are still very basic concerns from lang team members, and it seems they won't get resolved quickly, so it's unlikely to be merged any time soon, if at all.
The postfix-macros
crate provides you with a proc macro postfix_macros
that checks for possibly.chained.expression.macro_name!(params)
patterns
and then rewrites them in terms of traditional macro invocation, prepending
the expression to the passed parameters. This turns every "bang" macro
that's available to you into a potential postfix macro (UFCS style).
As if that wasn't enough, this crate additionally provides a set of
macros for use in a postfix context, for your greatest convenience.
As an example, the unwrap_or!
macro enables something that needed 5 lines before:
let v = if let Some(v) = something {
v
} else {
continue
};
to be written in a single line inside a postfix-macros
context:
let v = something.unwrap_or!(continue);
Furthermore, it also replaces the unwrap_or_else
closure pattern with
something that's closer to the unwrap_or
function in terms of cleanliness,
while being just as lazily evaluating as unwrap_or_else
:
let v = something.unwrap_or_else(|| some_expensive_fn_call(1, 2, 3));
let v = something.unwrap_or!(some_expensive_fn_call(1, 2, 3));
This crate has no dependencies beyond the one proc macro dependency, which itself has no dependencies. There is no reliance on the extremely slow to compile syn crate. The compile time is thus very short, and thus the crate has little footprint.
This choice also has some downsides, as syn is actually quite a powerful tool, namely that the expression precedence is different in some places to the precedence of normal Rust. These differences are regarded as bugs and users are welcome to file reports about them. Relying on the non-Rust-specific behaviour is not supported by the semver guarantee of this crate.
The MSRV of this crate is 1.42.0
.
This tool is distributed under the terms of both the MIT license and the Apache License (Version 2.0), at your option.
See LICENSE for details.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.