1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
#![no_std] //! A macro to define lambda-like macros inline. //! //! Syntax: //! //! `defmac!(` *name* [ *pattern* [, *pattern* ... ]] *=>* *expression* `)` //! //! *name* is the name of the new macro, followed by 0 or more patterns //! separated by comma. A pattern can be just an argument name like `x` //! or a pattern like `ref value`, `(x, y)` etc. //! //! Supports up to four arguments. //! //! # Example //! //! ``` //! #[macro_use] extern crate defmac; //! //! fn main() { //! defmac!(mkvec iter => iter.into_iter().collect::<Vec<_>>()); //! //! let v = mkvec!((0..10).map(|x| x * 2)); //! //! defmac!(repeat ref s, n => (0..n).map(|_| &s[..]).collect::<String>()); //! //! let text = String::from("abc"); //! let s = repeat!(text, 10); //! let t = repeat!("-", s.len()); //! println!("{}", s); //! println!("{}", t); //! //! } //! ``` /// A macro to define lambda-like macros inline. /// /// Syntax: /// /// `defmac!(` *name* [ *pattern* [, *pattern* ... ]] *=>* *expression* `)` /// /// *name* is the name of the new macro, followed by 0 or more patterns /// separated by comma. A pattern can be just an argument name like `x` /// or a pattern like `ref value`, `(x, y)` etc. /// /// Supports up to four arguments. #[macro_export] macro_rules! defmac { ($name:ident => $e:expr) => { macro_rules! $name { () => { $e } } }; ($name:ident $x:pat => $e:expr) => { macro_rules! $name { ($arg:expr) => { match $arg { $x => $e } } } }; ($name:ident $x1:pat, $x2:pat => $e:expr) => { macro_rules! $name { ($a1:expr, $a2:expr) => { match $a1 { $x1 => match $a2 { $x2 => $e } } } } }; ($name:ident $x1:pat, $x2:pat, $x3:pat => $e:expr) => { macro_rules! $name { ($a1:expr, $a2:expr, $a3:expr) => { match $a1 { $x1 => match $a2 { $x2 => match $a3 { $x3 => $e } } } } } }; ($name:ident $x1:pat, $x2:pat, $x3:pat, $x4:pat => $e:expr) => { macro_rules! $name { ($a1:expr, $a2:expr, $a3:expr, $a4:expr) => { match $a1 { $x1 => match $a2 { $x2 => match $a3 { $x3 => match $a4 { $x4 => $e } } } } } } }; } #[cfg(test)] mod tests { #[test] fn it_works() { } }