From e2a875143cf1449935b8828189304eaea1708933 Mon Sep 17 00:00:00 2001 From: Kivooeo Date: Tue, 28 Oct 2025 21:15:59 +0500 Subject: [PATCH] add misc 7 --- code/examples/misc_7.rs | 19 +++++++++++++++++++ src/SUMMARY.md | 1 + src/misc/7.md | 21 ++++++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 code/examples/misc_7.rs diff --git a/code/examples/misc_7.rs b/code/examples/misc_7.rs new file mode 100644 index 0000000..a39ef02 --- /dev/null +++ b/code/examples/misc_7.rs @@ -0,0 +1,19 @@ +macro_rules! capture { + ($e:expr) => { + transform!($e) + }; +} + +macro_rules! transform { + ($a:tt + $b:tt) => { + $a * $b + }; + ($other:expr) => { + $other + }; +} + +fn main() { + let x = capture!(2 + 3); + println!("{}", x); // what this will print? +} \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 5f791ef..50496d6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -16,6 +16,7 @@ - [Miscellaneous 4](./misc/4.md) - [Miscellaneous 5](./misc/5.md) - [Miscellaneous 6](./misc/6.md) +- [Miscellaneous 7](./misc/7.md) - [Miscellaneous 8](./misc/8.md) - [Miscellaneous 9](./misc/9.md) - [Miscellaneous 10](./misc/10.md) diff --git a/src/misc/7.md b/src/misc/7.md index c19adde..b03dc13 100644 --- a/src/misc/7.md +++ b/src/misc/7.md @@ -1,5 +1,20 @@ - \ No newline at end of file +```rust +{{#include ../../code/examples/misc_7.rs}} +``` + +
+Solution + +It will prints `5`. + +Once a token is captured as an expression (`:expr`), it becomes opaque to macro pattern matching and cannot be destructured into its component tokens. + +When `capture!(2 + 3)` is invoked, the `$e:expr` matcher captures `2 + 3` as a single expression token tree. This captured expression is then passed to `transform!($e)`, which attempts to match it against the pattern `$a:tt + $b:tt`. + +However, because `$e` was already captured as an `:expr`, it cannot be pattern-matched as separate tokens anymore. The first arm `$a:tt + $b:tt` fails to match, so the second arm `$other:expr` matches instead, and the expression `2 + 3` is returned as-is, evaluating to `5`. + +
\ No newline at end of file