Simplify implementation of join macro

This commit is contained in:
David Tolnay 2019-04-03 08:02:56 -07:00
parent cc46fbe621
commit 294572426b
No known key found for this signature in database
GPG key ID: F9BA143B95FF6D82

View file

@ -1,5 +1,5 @@
#[doc(hidden)]
#[macro_export(local_inner_macros)]
#[macro_export]
macro_rules! join {
{
$caller:tt
@ -13,41 +13,44 @@ macro_rules! join {
{
$caller:tt
sep = [{ $($sep:tt)* }]
item = [{ $($head:tt)* }]
$(
item = [{ $($tail:tt)* }]
)+
item = [{ $($first:tt)* }]
} => {
$crate::tt_call::tt_call! {
macro = [{ $crate::join }]
sep = [{ $($sep)* }]
$(
item = [{ $($tail)* }]
)+
~~> $crate::join! {
$caller
prepend = [{ $($head)* $($sep)* }]
}
$crate::tt_call::tt_return! {
$caller
joined = [{ $($first)* }]
}
};
{
$caller:tt
sep = [{ $($sep:tt)* }]
item = [{ $($head:tt)* }]
item = [{ $($first:tt)* }]
item = [{ $($second:tt)* }]
$(
item = [{ $($rest:tt)* }]
)*
} => {
$crate::tt_call::tt_return! {
$crate::join! {
$caller
joined = [{ $($head)* }]
}
};
{
$caller:tt
prepend = [{ $($prepend:tt)* }]
joined = [{ $($joined:tt)* }]
} => {
$crate::tt_call::tt_return! {
$caller
joined = [{ $($prepend)* $($joined)* }]
sep = [{ $($sep)* }]
item = [{ $($first)* $($sep)* $($second)* }]
$(
item = [{ $($rest)* }]
)*
}
};
}
#[test]
fn test_join() {
use tt_call::*;
let s = tt_call! {
macro = [{ join }]
sep = [{ .chars().rev().collect::<String>() + "_" + & }]
item = [{ "first " }]
item = [{ "second ".trim() }]
item = [{ "third " }]
};
assert_eq!(s, " tsrif_dnoces_third ");
}