]> git.proxmox.com Git - rustc.git/blame - src/doc/trpl/macros.md
Imported Upstream version 1.5.0+dfsg1
[rustc.git] / src / doc / trpl / macros.md
CommitLineData
85aaf69f
SL
1% Macros
2
bd371182 3By now you’ve learned about many of the tools Rust provides for abstracting and
85aaf69f
SL
4reusing code. These units of code reuse have a rich semantic structure. For
5example, functions have a type signature, type parameters have trait bounds,
6and overloaded functions must belong to a particular trait.
7
bd371182 8This structure means that Rust’s core abstractions have powerful compile-time
85aaf69f 9correctness checking. But this comes at the price of reduced flexibility. If
bd371182 10you visually identify a pattern of repeated code, you may find it’s difficult
85aaf69f 11or cumbersome to express that pattern as a generic function, a trait, or
bd371182 12anything else within Rust’s semantics.
85aaf69f 13
bd371182 14Macros allow us to abstract at a syntactic level. A macro invocation is
85aaf69f
SL
15shorthand for an "expanded" syntactic form. This expansion happens early in
16compilation, before any static checking. As a result, macros can capture many
bd371182 17patterns of code reuse that Rust’s core abstractions cannot.
85aaf69f
SL
18
19The drawback is that macro-based code can be harder to understand, because
20fewer of the built-in rules apply. Like an ordinary function, a well-behaved
21macro can be used without understanding its implementation. However, it can be
22difficult to design a well-behaved macro! Additionally, compiler errors in
23macro code are harder to interpret, because they describe problems in the
24expanded code, not the source-level form that developers use.
25
bd371182
AL
26These drawbacks make macros something of a "feature of last resort". That’s not
27to say that macros are bad; they are part of Rust because sometimes they’re
85aaf69f
SL
28needed for truly concise, well-abstracted code. Just keep this tradeoff in
29mind.
30
31# Defining a macro
32
62682a34
SL
33You may have seen the `vec!` macro, used to initialize a [vector][vector] with
34any number of elements.
85aaf69f 35
bd371182 36[vector]: vectors.html
85aaf69f
SL
37
38```rust
39let x: Vec<u32> = vec![1, 2, 3];
c34b1796 40# assert_eq!(x, [1, 2, 3]);
85aaf69f
SL
41```
42
bd371182 43This can’t be an ordinary function, because it takes any number of arguments.
85aaf69f
SL
44But we can imagine it as syntactic shorthand for
45
46```rust
47let x: Vec<u32> = {
48 let mut temp_vec = Vec::new();
49 temp_vec.push(1);
50 temp_vec.push(2);
51 temp_vec.push(3);
52 temp_vec
53};
c34b1796 54# assert_eq!(x, [1, 2, 3]);
85aaf69f
SL
55```
56
57We can implement this shorthand, using a macro: [^actual]
58
59[^actual]: The actual definition of `vec!` in libcollections differs from the
bd371182 60 one presented here, for reasons of efficiency and reusability.
85aaf69f
SL
61
62```rust
63macro_rules! vec {
64 ( $( $x:expr ),* ) => {
65 {
66 let mut temp_vec = Vec::new();
223e47cc 67 $(
85aaf69f
SL
68 temp_vec.push($x);
69 )*
70 temp_vec
223e47cc 71 }
85aaf69f 72 };
223e47cc 73}
85aaf69f 74# fn main() {
c34b1796 75# assert_eq!(vec![1,2,3], [1, 2, 3]);
223e47cc 76# }
85aaf69f 77```
1a4d82fc 78
bd371182 79Whoa, that’s a lot of new syntax! Let’s break it down.
223e47cc 80
85aaf69f
SL
81```ignore
82macro_rules! vec { ... }
83```
223e47cc 84
bd371182
AL
85This says we’re defining a macro named `vec`, much as `fn vec` would define a
86function named `vec`. In prose, we informally write a macro’s name with an
85aaf69f
SL
87exclamation point, e.g. `vec!`. The exclamation point is part of the invocation
88syntax and serves to distinguish a macro from an ordinary function.
223e47cc 89
85aaf69f 90## Matching
223e47cc 91
bd371182 92The macro is defined through a series of rules, which are pattern-matching
85aaf69f 93cases. Above, we had
223e47cc 94
85aaf69f
SL
95```ignore
96( $( $x:expr ),* ) => { ... };
97```
1a4d82fc 98
85aaf69f
SL
99This is like a `match` expression arm, but the matching happens on Rust syntax
100trees, at compile time. The semicolon is optional on the last (here, only)
bd371182 101case. The "pattern" on the left-hand side of `=>` is known as a ‘matcher’.
85aaf69f 102These have [their own little grammar] within the language.
1a4d82fc 103
85aaf69f 104[their own little grammar]: ../reference.html#macros
1a4d82fc 105
85aaf69f 106The matcher `$x:expr` will match any Rust expression, binding that syntax tree
bd371182
AL
107to the ‘metavariable’ `$x`. The identifier `expr` is a ‘fragment specifier’;
108the full possibilities are enumerated later in this chapter.
85aaf69f
SL
109Surrounding the matcher with `$(...),*` will match zero or more expressions,
110separated by commas.
111
112Aside from the special matcher syntax, any Rust tokens that appear in a matcher
113must match exactly. For example,
114
115```rust
116macro_rules! foo {
117 (x => $e:expr) => (println!("mode X: {}", $e));
118 (y => $e:expr) => (println!("mode Y: {}", $e));
1a4d82fc
JJ
119}
120
121fn main() {
85aaf69f 122 foo!(y => 3);
1a4d82fc 123}
85aaf69f 124```
1a4d82fc 125
85aaf69f 126will print
1a4d82fc 127
85aaf69f
SL
128```text
129mode Y: 3
130```
131
132With
1a4d82fc 133
85aaf69f
SL
134```rust,ignore
135foo!(z => 3);
136```
1a4d82fc 137
85aaf69f 138we get the compiler error
1a4d82fc 139
85aaf69f
SL
140```text
141error: no rules expected the token `z`
142```
1a4d82fc 143
85aaf69f 144## Expansion
1a4d82fc 145
85aaf69f
SL
146The right-hand side of a macro rule is ordinary Rust syntax, for the most part.
147But we can splice in bits of syntax captured by the matcher. From the original
148example:
149
150```ignore
151$(
152 temp_vec.push($x);
153)*
1a4d82fc
JJ
154```
155
85aaf69f
SL
156Each matched expression `$x` will produce a single `push` statement in the
157macro expansion. The repetition in the expansion proceeds in "lockstep" with
158repetition in the matcher (more on this in a moment).
1a4d82fc 159
bd371182
AL
160Because `$x` was already declared as matching an expression, we don’t repeat
161`:expr` on the right-hand side. Also, we don’t include a separating comma as
85aaf69f
SL
162part of the repetition operator. Instead, we have a terminating semicolon
163within the repeated block.
1a4d82fc 164
85aaf69f
SL
165Another detail: the `vec!` macro has *two* pairs of braces on the right-hand
166side. They are often combined like so:
1a4d82fc 167
85aaf69f
SL
168```ignore
169macro_rules! foo {
170 () => {{
171 ...
172 }}
173}
174```
175
176The outer braces are part of the syntax of `macro_rules!`. In fact, you can use
177`()` or `[]` instead. They simply delimit the right-hand side as a whole.
178
179The inner braces are part of the expanded syntax. Remember, the `vec!` macro is
180used in an expression context. To write an expression with multiple statements,
181including `let`-bindings, we use a block. If your macro expands to a single
bd371182 182expression, you don’t need this extra layer of braces.
85aaf69f
SL
183
184Note that we never *declared* that the macro produces an expression. In fact,
185this is not determined until we use the macro as an expression. With care, you
186can write a macro whose expansion works in several contexts. For example,
187shorthand for a data type could be valid as either an expression or a pattern.
1a4d82fc 188
85aaf69f 189## Repetition
1a4d82fc 190
c34b1796 191The repetition operator follows two principal rules:
1a4d82fc 192
c34b1796
AL
1931. `$(...)*` walks through one "layer" of repetitions, for all of the `$name`s
194 it contains, in lockstep, and
85aaf69f 1952. each `$name` must be under at least as many `$(...)*`s as it was matched
bd371182 196 against. If it is under more, it’ll be duplicated, as appropriate.
1a4d82fc 197
85aaf69f
SL
198This baroque macro illustrates the duplication of variables from outer
199repetition levels.
200
201```rust
202macro_rules! o_O {
203 (
204 $(
205 $x:expr; [ $( $y:expr ),* ]
206 );*
207 ) => {
208 &[ $($( $x + $y ),*),* ]
209 }
1a4d82fc
JJ
210}
211
85aaf69f
SL
212fn main() {
213 let a: &[i32]
214 = o_O!(10; [1, 2, 3];
215 20; [4, 5, 6]);
1a4d82fc 216
85aaf69f
SL
217 assert_eq!(a, [11, 12, 13, 24, 25, 26]);
218}
219```
1a4d82fc 220
bd371182 221That’s most of the matcher syntax. These examples use `$(...)*`, which is a
85aaf69f
SL
222"zero or more" match. Alternatively you can write `$(...)+` for a "one or
223more" match. Both forms optionally include a separator, which can be any token
224except `+` or `*`.
1a4d82fc 225
c34b1796 226This system is based on
62682a34 227"[Macro-by-Example](https://www.cs.indiana.edu/ftp/techreports/TR206.pdf)"
c34b1796
AL
228(PDF link).
229
85aaf69f 230# Hygiene
1a4d82fc 231
85aaf69f
SL
232Some languages implement macros using simple text substitution, which leads to
233various problems. For example, this C program prints `13` instead of the
234expected `25`.
1a4d82fc 235
85aaf69f
SL
236```text
237#define FIVE_TIMES(x) 5 * x
238
239int main() {
240 printf("%d\n", FIVE_TIMES(2 + 3));
241 return 0;
1a4d82fc 242}
85aaf69f 243```
1a4d82fc 244
85aaf69f 245After expansion we have `5 * 2 + 3`, and multiplication has greater precedence
bd371182 246than addition. If you’ve used C macros a lot, you probably know the standard
85aaf69f 247idioms for avoiding this problem, as well as five or six others. In Rust, we
bd371182 248don’t have to worry about it.
85aaf69f
SL
249
250```rust
251macro_rules! five_times {
252 ($x:expr) => (5 * $x);
253}
254
255fn main() {
256 assert_eq!(25, five_times!(2 + 3));
257}
1a4d82fc
JJ
258```
259
85aaf69f
SL
260The metavariable `$x` is parsed as a single expression node, and keeps its
261place in the syntax tree even after substitution.
262
bd371182
AL
263Another common problem in macro systems is ‘variable capture’. Here’s a C
264macro, using [a GNU C extension] to emulate Rust’s expression blocks.
85aaf69f
SL
265
266[a GNU C extension]: https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
1a4d82fc 267
85aaf69f
SL
268```text
269#define LOG(msg) ({ \
270 int state = get_log_state(); \
271 if (state > 0) { \
272 printf("log(%d): %s\n", state, msg); \
273 } \
274})
275```
276
bd371182 277Here’s a simple use case that goes terribly wrong:
1a4d82fc 278
85aaf69f
SL
279```text
280const char *state = "reticulating splines";
c34b1796 281LOG(state)
85aaf69f 282```
1a4d82fc 283
c34b1796 284This expands to
85aaf69f
SL
285
286```text
c34b1796
AL
287const char *state = "reticulating splines";
288int state = get_log_state();
289if (state > 0) {
290 printf("log(%d): %s\n", state, state);
291}
85aaf69f
SL
292```
293
c34b1796
AL
294The second variable named `state` shadows the first one. This is a problem
295because the print statement should refer to both of them.
296
85aaf69f 297The equivalent Rust macro has the desired behavior.
1a4d82fc
JJ
298
299```rust
85aaf69f
SL
300# fn get_log_state() -> i32 { 3 }
301macro_rules! log {
302 ($msg:expr) => {{
303 let state: i32 = get_log_state();
304 if state > 0 {
305 println!("log({}): {}", state, $msg);
306 }
307 }};
1a4d82fc
JJ
308}
309
85aaf69f
SL
310fn main() {
311 let state: &str = "reticulating splines";
312 log!(state);
1a4d82fc 313}
85aaf69f
SL
314```
315
e9174d1e 316This works because Rust has a [hygienic macro system]. Each macro expansion
bd371182
AL
317happens in a distinct ‘syntax context’, and each variable is tagged with the
318syntax context where it was introduced. It’s as though the variable `state`
85aaf69f 319inside `main` is painted a different "color" from the variable `state` inside
bd371182 320the macro, and therefore they don’t conflict.
1a4d82fc 321
62682a34 322[hygienic macro system]: https://en.wikipedia.org/wiki/Hygienic_macro
85aaf69f
SL
323
324This also restricts the ability of macros to introduce new bindings at the
325invocation site. Code such as the following will not work:
326
327```rust,ignore
328macro_rules! foo {
329 () => (let x = 3);
330}
331
332fn main() {
333 foo!();
334 println!("{}", x);
1a4d82fc 335}
1a4d82fc
JJ
336```
337
bd371182 338Instead you need to pass the variable name into the invocation, so it’s tagged
85aaf69f 339with the right syntax context.
1a4d82fc 340
85aaf69f
SL
341```rust
342macro_rules! foo {
343 ($v:ident) => (let $v = 3);
344}
345
346fn main() {
347 foo!(x);
348 println!("{}", x);
349}
350```
351
62682a34 352This holds for `let` bindings and loop labels, but not for [items][items].
85aaf69f 353So the following code does compile:
1a4d82fc
JJ
354
355```rust
85aaf69f
SL
356macro_rules! foo {
357 () => (fn x() { });
358}
359
360fn main() {
361 foo!();
362 x();
1a4d82fc 363}
1a4d82fc
JJ
364```
365
85aaf69f
SL
366[items]: ../reference.html#items
367
c34b1796
AL
368# Recursive macros
369
bd371182 370A macro’s expansion can include more macro invocations, including invocations
c34b1796
AL
371of the very same macro being expanded. These recursive macros are useful for
372processing tree-structured input, as illustrated by this (simplistic) HTML
373shorthand:
374
375```rust
376# #![allow(unused_must_use)]
377macro_rules! write_html {
378 ($w:expr, ) => (());
379
380 ($w:expr, $e:tt) => (write!($w, "{}", $e));
381
382 ($w:expr, $tag:ident [ $($inner:tt)* ] $($rest:tt)*) => {{
383 write!($w, "<{}>", stringify!($tag));
384 write_html!($w, $($inner)*);
385 write!($w, "</{}>", stringify!($tag));
386 write_html!($w, $($rest)*);
387 }};
388}
389
390fn main() {
391# // FIXME(#21826)
392 use std::fmt::Write;
393 let mut out = String::new();
394
395 write_html!(&mut out,
396 html[
397 head[title["Macros guide"]]
398 body[h1["Macros are the best!"]]
399 ]);
400
401 assert_eq!(out,
402 "<html><head><title>Macros guide</title></head>\
403 <body><h1>Macros are the best!</h1></body></html>");
404}
405```
406
407# Debugging macro code
408
409To see the results of expanding macros, run `rustc --pretty expanded`. The
410output represents a whole crate, so you can also feed it back in to `rustc`,
411which will sometimes produce better error messages than the original
412compilation. Note that the `--pretty expanded` output may have a different
413meaning if multiple variables of the same name (but different syntax contexts)
414are in play in the same scope. In this case `--pretty expanded,hygiene` will
415tell you about the syntax contexts.
416
417`rustc` provides two syntax extensions that help with macro debugging. For now,
418they are unstable and require feature gates.
419
420* `log_syntax!(...)` will print its arguments to standard output, at compile
421 time, and "expand" to nothing.
422
423* `trace_macros!(true)` will enable a compiler message every time a macro is
424 expanded. Use `trace_macros!(false)` later in expansion to turn it off.
425
9346a6ac 426# Syntactic requirements
85aaf69f 427
9346a6ac
AL
428Even when Rust code contains un-expanded macros, it can be parsed as a full
429[syntax tree][ast]. This property can be very useful for editors and other
430tools that process code. It also has a few consequences for the design of
bd371182 431Rust’s macro system.
85aaf69f 432
9346a6ac
AL
433[ast]: glossary.html#abstract-syntax-tree
434
435One consequence is that Rust must determine, when it parses a macro invocation,
436whether the macro stands in for
437
438* zero or more items,
439* zero or more methods,
440* an expression,
441* a statement, or
442* a pattern.
443
444A macro invocation within a block could stand for some items, or for an
445expression / statement. Rust uses a simple rule to resolve this ambiguity. A
446macro invocation that stands for items must be either
447
448* delimited by curly braces, e.g. `foo! { ... }`, or
449* terminated by a semicolon, e.g. `foo!(...);`
450
451Another consequence of pre-expansion parsing is that the macro invocation must
452consist of valid Rust tokens. Furthermore, parentheses, brackets, and braces
453must be balanced within a macro invocation. For example, `foo!([)` is
454forbidden. This allows Rust to know where the macro invocation ends.
455
bd371182 456More formally, the macro invocation body must be a sequence of ‘token trees’.
9346a6ac
AL
457A token tree is defined recursively as either
458
459* a sequence of token trees surrounded by matching `()`, `[]`, or `{}`, or
460* any other single token.
461
bd371182 462Within a matcher, each metavariable has a ‘fragment specifier’, identifying
9346a6ac
AL
463which syntactic form it matches.
464
465* `ident`: an identifier. Examples: `x`; `foo`.
466* `path`: a qualified name. Example: `T::SpecialA`.
467* `expr`: an expression. Examples: `2 + 2`; `if true then { 1 } else { 2 }`; `f(42)`.
468* `ty`: a type. Examples: `i32`; `Vec<(char, String)>`; `&T`.
469* `pat`: a pattern. Examples: `Some(t)`; `(17, 'a')`; `_`.
470* `stmt`: a single statement. Example: `let x = 3`.
471* `block`: a brace-delimited sequence of statements. Example:
472 `{ log(error, "hi"); return 12; }`.
62682a34 473* `item`: an [item][item]. Examples: `fn foo() { }`; `struct Bar;`.
9346a6ac
AL
474* `meta`: a "meta item", as found in attributes. Example: `cfg(target_os = "windows")`.
475* `tt`: a single token tree.
476
477There are additional rules regarding the next token after a metavariable:
478
62682a34
SL
479* `expr` variables may only be followed by one of: `=> , ;`
480* `ty` and `path` variables may only be followed by one of: `=> , : = > as`
481* `pat` variables may only be followed by one of: `=> , = if in`
9346a6ac
AL
482* Other variables may be followed by any token.
483
bd371182 484These rules provide some flexibility for Rust’s syntax to evolve without
9346a6ac
AL
485breaking existing macros.
486
487The macro system does not deal with parse ambiguity at all. For example, the
488grammar `$($t:ty)* $e:expr` will always fail to parse, because the parser would
489be forced to choose between parsing `$t` and parsing `$e`. Changing the
490invocation syntax to put a distinctive token in front can solve the problem. In
491this case, you can write `$(T $t:ty)* E $e:exp`.
492
493[item]: ../reference.html#items
494
495# Scoping and macro import/export
496
497Macros are expanded at an early stage in compilation, before name resolution.
498One downside is that scoping works differently for macros, compared to other
499constructs in the language.
500
501Definition and expansion of macros both happen in a single depth-first,
bd371182 502lexical-order traversal of a crate’s source. So a macro defined at module scope
9346a6ac
AL
503is visible to any subsequent code in the same module, which includes the body
504of any subsequent child `mod` items.
505
506A macro defined within the body of a single `fn`, or anywhere else not at
507module scope, is visible only within that item.
508
509If a module has the `macro_use` attribute, its macros are also visible in its
bd371182
AL
510parent module after the child’s `mod` item. If the parent also has `macro_use`
511then the macros will be visible in the grandparent after the parent’s `mod`
9346a6ac
AL
512item, and so forth.
513
514The `macro_use` attribute can also appear on `extern crate`. In this context
515it controls which macros are loaded from the external crate, e.g.
516
517```rust,ignore
518#[macro_use(foo, bar)]
519extern crate baz;
520```
521
522If the attribute is given simply as `#[macro_use]`, all macros are loaded. If
523there is no `#[macro_use]` attribute then no macros are loaded. Only macros
524defined with the `#[macro_export]` attribute may be loaded.
525
bd371182 526To load a crate’s macros without linking it into the output, use `#[no_link]`
9346a6ac
AL
527as well.
528
529An example:
530
531```rust
532macro_rules! m1 { () => (()) }
533
534// visible here: m1
535
536mod foo {
537 // visible here: m1
538
539 #[macro_export]
540 macro_rules! m2 { () => (()) }
541
542 // visible here: m1, m2
543}
544
545// visible here: m1
546
547macro_rules! m3 { () => (()) }
548
549// visible here: m1, m3
550
551#[macro_use]
552mod bar {
553 // visible here: m1, m3
554
555 macro_rules! m4 { () => (()) }
556
557 // visible here: m1, m3, m4
558}
559
560// visible here: m1, m3, m4
561# fn main() { }
562```
563
564When this library is loaded with `#[macro_use] extern crate`, only `m2` will
565be imported.
566
567The Rust Reference has a [listing of macro-related
bd371182 568attributes](../reference.html#macro-related-attributes).
9346a6ac
AL
569
570# The variable `$crate`
571
572A further difficulty occurs when a macro is used in multiple crates. Say that
573`mylib` defines
574
575```rust
576pub fn increment(x: u32) -> u32 {
577 x + 1
578}
579
580#[macro_export]
581macro_rules! inc_a {
582 ($x:expr) => ( ::increment($x) )
583}
584
585#[macro_export]
586macro_rules! inc_b {
587 ($x:expr) => ( ::mylib::increment($x) )
588}
589# fn main() { }
590```
591
592`inc_a` only works within `mylib`, while `inc_b` only works outside the
593library. Furthermore, `inc_b` will break if the user imports `mylib` under
594another name.
595
596Rust does not (yet) have a hygiene system for crate references, but it does
597provide a simple workaround for this problem. Within a macro imported from a
598crate named `foo`, the special macro variable `$crate` will expand to `::foo`.
599By contrast, when a macro is defined and then used in the same crate, `$crate`
600will expand to nothing. This means we can write
601
602```rust
603#[macro_export]
604macro_rules! inc {
605 ($x:expr) => ( $crate::increment($x) )
606}
607# fn main() { }
608```
609
610to define a single macro that works both inside and outside our library. The
611function name will expand to either `::increment` or `::mylib::increment`.
612
613To keep this system simple and correct, `#[macro_use] extern crate ...` may
614only appear at the root of your crate, not inside `mod`. This ensures that
615`$crate` is a single identifier.
616
617# The deep end
618
619The introductory chapter mentioned recursive macros, but it did not give the
620full story. Recursive macros are useful for another reason: Each recursive
bd371182 621invocation gives you another opportunity to pattern-match the macro’s
9346a6ac
AL
622arguments.
623
624As an extreme example, it is possible, though hardly advisable, to implement
62682a34 625the [Bitwise Cyclic Tag](https://esolangs.org/wiki/Bitwise_Cyclic_Tag) automaton
bd371182 626within Rust’s macro system.
9346a6ac
AL
627
628```rust
629macro_rules! bct {
630 // cmd 0: d ... => ...
631 (0, $($ps:tt),* ; $_d:tt)
632 => (bct!($($ps),*, 0 ; ));
633 (0, $($ps:tt),* ; $_d:tt, $($ds:tt),*)
634 => (bct!($($ps),*, 0 ; $($ds),*));
635
636 // cmd 1p: 1 ... => 1 ... p
637 (1, $p:tt, $($ps:tt),* ; 1)
638 => (bct!($($ps),*, 1, $p ; 1, $p));
639 (1, $p:tt, $($ps:tt),* ; 1, $($ds:tt),*)
640 => (bct!($($ps),*, 1, $p ; 1, $($ds),*, $p));
641
642 // cmd 1p: 0 ... => 0 ...
643 (1, $p:tt, $($ps:tt),* ; $($ds:tt),*)
644 => (bct!($($ps),*, 1, $p ; $($ds),*));
645
646 // halt on empty data string
647 ( $($ps:tt),* ; )
648 => (());
649}
650```
651
652Exercise: use macros to reduce duplication in the above definition of the
653`bct!` macro.
654
bd371182
AL
655# Common macros
656
657Here are some common macros you’ll see in Rust code.
658
659## panic!
660
661This macro causes the current thread to panic. You can give it a message
662to panic with:
663
664```rust,no_run
665panic!("oh no!");
666```
667
668## vec!
669
670The `vec!` macro is used throughout the book, so you’ve probably seen it
671already. It creates `Vec<T>`s with ease:
672
673```rust
674let v = vec![1, 2, 3, 4, 5];
675```
676
677It also lets you make vectors with repeating values. For example, a hundred
678zeroes:
679
680```rust
681let v = vec![0; 100];
682```
683
684## assert! and assert_eq!
685
62682a34
SL
686These two macros are used in tests. `assert!` takes a boolean. `assert_eq!`
687takes two values and checks them for equality. `true` passes, `false` `panic!`s.
688Like this:
bd371182
AL
689
690```rust,no_run
691// A-ok!
692
693assert!(true);
694assert_eq!(5, 3 + 2);
695
696// nope :(
697
698assert!(5 < 3);
699assert_eq!(5, 3);
700```
62682a34 701
bd371182
AL
702## try!
703
704`try!` is used for error handling. It takes something that can return a
705`Result<T, E>`, and gives `T` if it’s a `Ok<T>`, and `return`s with the
706`Err(E)` if it’s that. Like this:
707
708```rust,no_run
709use std::fs::File;
710
711fn foo() -> std::io::Result<()> {
712 let f = try!(File::create("foo.txt"));
713
714 Ok(())
715}
716```
717
718This is cleaner than doing this:
719
720```rust,no_run
721use std::fs::File;
722
723fn foo() -> std::io::Result<()> {
724 let f = File::create("foo.txt");
725
726 let f = match f {
727 Ok(t) => t,
728 Err(e) => return Err(e),
729 };
730
731 Ok(())
732}
733```
734
735## unreachable!
736
737This macro is used when you think some code should never execute:
738
739```rust
740if false {
741 unreachable!();
742}
743```
744
745Sometimes, the compiler may make you have a different branch that you know
746will never, ever run. In these cases, use this macro, so that if you end
747up wrong, you’ll get a `panic!` about it.
748
749```rust
750let x: Option<i32> = None;
751
752match x {
753 Some(_) => unreachable!(),
754 None => println!("I know x is None!"),
755}
756```
757
758## unimplemented!
759
760The `unimplemented!` macro can be used when you’re trying to get your functions
761to typecheck, and don’t want to worry about writing out the body of the
762function. One example of this situation is implementing a trait with multiple
763required methods, where you want to tackle one at a time. Define the others
764as `unimplemented!` until you’re ready to write them.
765
9346a6ac
AL
766# Procedural macros
767
bd371182
AL
768If Rust’s macro system can’t do what you need, you may want to write a
769[compiler plugin](compiler-plugins.html) instead. Compared to `macro_rules!`
9346a6ac
AL
770macros, this is significantly more work, the interfaces are much less stable,
771and bugs can be much harder to track down. In exchange you get the
772flexibility of running arbitrary Rust code within the compiler. Syntax
bd371182 773extension plugins are sometimes called ‘procedural macros’ for this reason.