[−][src]Macro with_builtin_macros::with_builtin
with_builtin!() { /* proc-macro */ }
Pre-processor (pattern) with hard-coded implementations for some of the built-in macros, so as to be able to chain their result with custom macros.
By using a pre-processor, this also enables "using" macros where it is otherwise forbidden.
For instance, the following code fails to compile:
ⓘThis example deliberately fails to compile
fn concat_idents!(f, o, o) () {} fn main () { foo(); }
But the following call does not:
use ::with_builtin_macros::with_builtin; with_builtin!(let $fname = concat_idents!(f, o, o) in { fn $fname () {} }); fn main () { foo(); }
- Note: for this behavior, with some added neat features (such as case
conversion), see the
::paste::paste!
macro.
Even if we forget about allowed macro call-sites, there is also the issue of macro evaluation order leading to things like the following not working:
ⓘThis example deliberately fails to compile
/// Some (proc-)macro that expects a string literal containing a hexadecimal /// sequence of digits, that it decodes into the represented byte sequence. use ::hex_literal::hex; const BYTES: &[u8] = hex!(include_str!(concat!( env!("CARGO_MANIFEST_DIR"), "/", "data.hex", )));
With with_builtin!
, however, the following works:
/// Some (proc-)macro that expects a string literal containing a hexadecimal /// sequence of digits, that it decodes into the represented byte sequence. use ::hex_literal::hex; use ::with_builtin_macros::with_builtin; const BYTES: &[u8] = { with_builtin!(let $hex_str = include_str_from_root!("data.hex") in { hex!($hex_str) }) };