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
//! Tailcall is a library that adds safe, zero-cost [tail recursion] to stable Rust.
//! Eventually, it will be superseded by the [`become` keyword].
//!
//! # Usage
//!
//! To guarantee that recursive calls a function will reuse the same stack frame,
//! annotate it with the [`tailcall`] attribute.
//!
//! ```
//! use tailcall::tailcall;
//!
//! fn factorial(input: u64) -> u64 {
//! #[tailcall]
//! fn factorial_inner(accumulator: u64, input: u64) -> u64 {
//! if input > 0 {
//! factorial_inner(accumulator * input, input - 1)
//! } else {
//! accumulator
//! }
//! }
//!
//! factorial_inner(1, input)
//! }
//! ```
//!
//! Recursive calls which are not in tail form will result in a compile-time error.
//!
//! ```compile_fail
//! use tailcall::tailcall;
//!
//! #[tailcall]
//! fn factorial(input: u64) -> u64 {
//! if input > 0 {
//! input * factorial(input - 1)
//! } else {
//! 1
//! }
//! }
//! ```
//!
//! [tail recursion]: https://en.wikipedia.org/wiki/Tail_call
//! [`become` keyword]: https://internals.rust-lang.org/t/pre-rfc-explicit-proper-tail-calls/3797/16
//! [`tailcall`]: attr.tailcall.html
pub use tailcall;