RFC 1590: macro-lifetimes

lang (macros | syntax)

Summary

Add a lifetime specifier for macro_rules! patterns, that matches any valid lifetime.

Motivation

Certain classes of macros are completely impossible without the ability to pass lifetimes. Specifically, anything that wants to implement a trait from inside of a macro is going to need to deal with lifetimes eventually. They're also commonly needed for any macros that need to deal with types in a more granular way than just ty.

Since a lifetime is a single token, the only way to match against a lifetime is by capturing it as tt. Something like '$lifetime:ident would fail to compile. This is extremely limiting, as it becomes difficult to sanitize input, and tt is extremely difficult to use in a sequence without using awkward separators.

Detailed design

This RFC proposes adding lifetime as an additional specifier to macro_rules! (alternatively: life or lt). As it is a single token, it is able to be followed by any other specifier. Since a lifetime acts very much like an identifier, and can appear in almost as many places, it can be handled almost identically.

A preliminary implementation can be found at https://github.com/rust-lang/rust/pull/33135

Drawbacks

None

Alternatives

A more general specifier, such as a "type parameter list", which would roughly map to ast::Generics would cover most of the cases that matching lifetimes individually would cover.

Unresolved questions

None