aboutsummaryrefslogtreecommitdiff
path: root/rust/macros/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'rust/macros/README.md')
-rw-r--r--rust/macros/README.md66
1 files changed, 66 insertions, 0 deletions
diff --git a/rust/macros/README.md b/rust/macros/README.md
new file mode 100644
index 0000000..c1e6015
--- /dev/null
+++ b/rust/macros/README.md
@@ -0,0 +1,66 @@
1# Macros
2
3Welcome to Macros on Exercism's Rust Track.
4If you need help running the tests or submitting your code, check out `HELP.md`.
5
6## Instructions
7
8Macros are a powerful part of a Rust programmer's toolkit, and [macros by example](https://doc.rust-lang.org/reference/macros-by-example.html) are a relatively simple way to access this power. Let's write one!
9
10## Context
11
12What is a macro? [Wikipedia](https://en.wikipedia.org/wiki/Macro_(computer_science)) describes it thus:
13
14> A macro (short for "macroinstruction", from Greek μακρός 'long') in computer science is a rule or pattern that specifies how a certain input sequence (often a sequence of characters) should be mapped to a replacement output sequence (also often a sequence of characters) according to a defined procedure. The mapping process that instantiates (transforms) a macro use into a specific sequence is known as macro expansion.
15
16Illuminating! But to be more concrete, macros are a special syntax which allows you to generate code at compile time. Macros can be used for compile-time calculation, but more often they're just another way to abstract your code. For example, you've probably already used `println!()` and `vec![]`. These each take an arbitrary number of arguments, so you can't express them as simple functions. On the other hand, they always expand to some amount of absolutely standard Rust code. If you're interested, you can use the [cargo expand](https://github.com/dtolnay/cargo-expand) subcommand to view the results of macro expansion in your code.
17
18For further information about macros in Rust, The Rust Book has a [good chapter](https://doc.rust-lang.org/book/ch19-06-macros.html) on them.
19
20## Problem Statement
21
22You can produce a `Vec` of arbitrary length inline by using the `vec![]` macro. However, Rust doesn't come with a way to produce a [`HashMap`](https://doc.rust-lang.org/std/collections/struct.HashMap.html) inline. Rectify this by writing a `hashmap!()` macro.
23
24For example, a user of your library might write `hashmap!('a' => 3, 'b' => 11, 'z' => 32)`. This should expand to the following code:
25
26```rust
27{
28 let mut hm = HashMap::new();
29 hm.insert('a', 3);
30 hm.insert('b', 11);
31 hm.insert('z', 32);
32 hm
33}
34```
35
36Note that the [`maplit` crate](https://crates.io/crates/maplit) provides a macro which perfectly solves this exercise. Please implement your own solution instead of using this crate; please make an attempt on your own before viewing its source.
37
38Note that this exercise requires Rust 1.36 or later.
39
40## Source
41
42### Created by
43
44- @coriolinus
45
46### Contributed to by
47
48- @bantic
49- @cwhakes
50- @DarthStrom
51- @efx
52- @Emerentius
53- @ErikSchierboom
54- @lutostag
55- @pedantic79
56- @petertseng
57- @rofrol
58- @ssomers
59- @stringparser
60- @tjade273
61- @xakon
62- @ZapAnton
63
64### Based on
65
66Peter Goodspeed-Niklaus \ No newline at end of file