From 248d87a2dd3eec0dba93ef13f7a999940c9d4840 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 17 Mar 2017 09:30:29 -0500 Subject: [PATCH 1/2] add macros examples --- macros/macros1.rs | 62 +++++++++++++++++++++++++++++++++++++++ macros/macros2.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++ macros/macros3.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 macros/macros1.rs create mode 100644 macros/macros2.rs create mode 100644 macros/macros3.rs diff --git a/macros/macros1.rs b/macros/macros1.rs new file mode 100644 index 00000000..b2f48e49 --- /dev/null +++ b/macros/macros1.rs @@ -0,0 +1,62 @@ +// Make me compile! Scroll down for hints :) + +macro_rules! my_macro { + () => { + println!("Check out my macro!"); + }; +} + +fn main() { + my_macro(); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// When you call a macro, you need to add something special compared to a regular function call. If +// you're stuck, take a look at what's inside `my_macro`. diff --git a/macros/macros2.rs b/macros/macros2.rs new file mode 100644 index 00000000..040dc7f9 --- /dev/null +++ b/macros/macros2.rs @@ -0,0 +1,72 @@ +// Make me compile! Scroll down for hints :) + +fn main() { + my_macro!(); +} + +macro_rules! my_macro { + () => { + println!("Check out my macro!"); + }; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Macros don't quite play by the same rules as the rest of Rust, in terms of what's available +// where. + + + + + + + + +// Unlike other things in Rust, the order of "where you define a macro" versus "where you use it" +// actually matters. diff --git a/macros/macros3.rs b/macros/macros3.rs new file mode 100644 index 00000000..8d8da38e --- /dev/null +++ b/macros/macros3.rs @@ -0,0 +1,74 @@ +// Make me compile, without taking the macro out of the module! Scroll down for hints :) + +mod macros { + macro_rules! my_macro { + () => { + println!("Check out my macro!"); + }; + } +} + +fn main() { + my_macro!(); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// In order to use a macro outside of its module, you need to do something special to the module to +// lift the macro out into its parent. + + + + + + + + +// The same trick also works on "extern crate" statements for crates that have exported macros, if +// you've seen any of those around. From 2b70161b4f5961c313439ef8a132c4dfcd597216 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 17 Mar 2017 09:47:45 -0500 Subject: [PATCH 2/2] add macros4 example --- macros/macros4.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 macros/macros4.rs diff --git a/macros/macros4.rs b/macros/macros4.rs new file mode 100644 index 00000000..57dc431d --- /dev/null +++ b/macros/macros4.rs @@ -0,0 +1,76 @@ +// Make me compile! Scroll down for hints :) + +macro_rules! my_macro { + () => { + println!("Check out my macro!"); + } + ($val:expr) => { + println!("Look at this other macro: {}", $val); + } +} + +fn main() { + my_macro!(); + my_macro!(7777); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// You only need to add a single character to make this compile. + + + + + + + + + +// The way macros are written, it wants to see something between each "macro arm", so it can +// separate them.